pcalcado :
Errado. Um BO é uma "classe de lógica", que fere Orientação a Objetos.
Então no caso de uma boa arquitetura, teremos classes domains que contém as propriedades dos objetos do domínio do sistema e nessas mesma classes teremos as lógicas de negócio desses objetos?
Eu pensei depois do que li aqui em montar a arquitetura da seguinte maneira:
dominio
----persistencia
------exceptions
----pojos (objetos,get/set)
classes de negocio ficariam dentro do pacote dominio
faces
util
Na classe util, teria uma classia BeanFactoryHelper ,idéia sugerida por um colega daqui do GUJ (du123)
E esse helper faria chamado aos daos do spring que usariam templates do hibernate para criar os objetos.
Ai faria as chamadas da seguine maneira
faces->dominio (como serviços,precisaria de uma interface?)->persistencia
transitando o pojo referente ao domínio...
Exemplo na tela de inserção de uma instituição....
como uso jsf ,eu teria um atributo do faces InstituicaoModel que passaria ele preenchido para o serviço que invocaria a classe helper para obter o dao correto e faria a persistencia...
no caso de existirem regras de negócio, as faria na chamada do faces.
Em cascata, faria chamada de serviços, para cada classe de serviço...
O aplication-context do spring ficou assim:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="dataSourceMonografias"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="org.gjt.mm.mysql.Driver" />
<property name="url"
value="jdbc:mysql://localhost:3306/monografias" />
<property name="username" value="root" />
<property name="password" value="popete" />
</bean>
<bean id="sessionFactoryMonografias"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSourceMonografias" />
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="current_session_context_class">thread</prop>
<prop key="cache.provider_class">
org.hibernate.cache.NoCacheProvider
</prop>
<prop key="show_sql">true</prop>
<prop key="connection.pool_size">10</prop>
</props>
</property>
<!--
<property name="mappingClass">
<list>
<value>br.ucsal.projeto.model.AutorModel</value>
<value>br.ucsal.projeto.model.CursoModel</value>
<value>br.ucsal.projeto.model.InstituicaoModel</value>
<value>br.ucsal.projeto.model.DocumentoModel</value>
</list>
</property>
-->
<property name="mappingDirectoryLocations">
<list>
<value>classpath:/br/ucsal/projeto/model</value>
</list>
</property>
</bean>
<bean id="hibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory">
<ref bean="sessionFactoryMonografias" />
</property>
</bean>
<bean id="instituicaoDao"
class="br.ucsal.projeto.dao.impl.InstituicaoDAOImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<bean id="autorDao"
class="br.ucsal.projeto.dao.impl.AutorDAOImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<bean id="cursoDao"
class="br.ucsal.projeto.dao.impl.CursoDAOImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
<bean id="documentoDao"
class="br.ucsal.projeto.dao.impl.DocumentoDAOImpl">
<property name="hibernateTemplate">
<ref bean="hibernateTemplate" />
</property>
</bean>
</beans>
e o BeanHelper ficou assim:
package br.ucsal.projeto.util;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class BeanFactoryHelper {
public static ApplicationContext contexto;
static{
contexto = new ClassPathXmlApplicationContext(ProjetoConstantes.ARQUIVO_CONFIG_SPRING);
}
private BeanFactoryHelper() {
}
public static ApplicationContext getInstance(){
return contexto;
}
public static Object getBean(String bean){
return contexto.getBean(bean);
}
}
bem como um exemplo de um dao
package br.ucsal.projeto.dao.impl;
import java.util.Collection;
import org.springframework.dao.DataAccessException;
import org.springframework.orm.hibernate3.HibernateTemplate;
import br.ucsal.projeto.dao.AutorDAO;
import br.ucsal.projeto.model.AutorModel;
public class AutorDAOImpl implements AutorDAO {
private HibernateTemplate hibernateTemplate;
@SuppressWarnings("unchecked")
public Collection<AutorModel> findAll() throws DataAccessException {
return this.hibernateTemplate.loadAll(AutorModel.class);
}
public void delete(AutorModel autorModel) {
this.hibernateTemplate.delete(autorModel);
}
public AutorModel get(AutorModel autorModel) {
return (AutorModel) this.hibernateTemplate.get(AutorModel.class,
autorModel.getId());
}
public AutorModel load(AutorModel autorModel) {
return (AutorModel) this.hibernateTemplate.load(AutorModel.class,
autorModel.getId());
}
public AutorModel save(AutorModel autorModel) {
return (AutorModel) this.hibernateTemplate.save(autorModel);
}
public void update(AutorModel autorModel) {
this.hibernateTemplate.update(autorModel);
}
public HibernateTemplate getHibernateTemplate() {
return hibernateTemplate;
}
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
this.hibernateTemplate = hibernateTemplate;
}
}
e de utilziação da arquitetura:
package br.ucsal.projeto.faces;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;
import br.ucsal.projeto.bo.InstituicaoBO;
import br.ucsal.projeto.model.CursoModel;
import br.ucsal.projeto.model.InstituicaoModel;
public class CadastroMapaFaces {
private CursoModel cursoModel;
private List<SelectItem> instituicoes;
private List<SelectItem> cursos;
private InstituicaoBO instituicaoBO;
public CadastroMapaFaces() {
instituicaoBO = new InstituicaoBO();
this.limpar();
}
private void limpar() {
this.cursoModel = new CursoModel();
this.cursoModel.setInstituicaoModel(new InstituicaoModel());
this.getInstituicoesCadastradas();
this.cursos = new ArrayList<SelectItem>();
}
private void getInstituicoesCadastradas() {
this.instituicoes = new ArrayList<SelectItem>();
for (InstituicaoModel instituicaoModel : this.instituicaoService.findAll()) {
this.instituicoes.add(new SelectItem(instituicaoModel.getId()
.toString(), instituicaoModel.getSigla()));
}
}
public CursoModel getCursoModel() {
return cursoModel;
}
public void setCursoModel(CursoModel cursoModel) {
this.cursoModel = cursoModel;
}
public List<SelectItem> getInstituicoes() {
return instituicoes;
}
public void setInstituicoes(List<SelectItem> instituicoes) {
this.instituicoes = instituicoes;
}
public List<SelectItem> getCursos() {
return cursos;
}
public void setCursos(List<SelectItem> cursos) {
this.cursos = cursos;
}
}
e então?O que acham?