Colegas,
Estou migrando uma b[/b] aplicação JSF 1.2 + Spring 2 + Hibernate 3 para uma solução b[/b] JSF 1.2 + EJB3/JPA + Hibernate e estou com dúvidas quanto a definição da arquitetura.
Na aplicação b[/b] o projeto está divido na seguinte estrutura :
- Dá Página até o banco faço o seguinte caminho:
1) Minhas páginas XHTML + o Framework Faceletes para montar os templates.
2) A página acessa ManagedBeans do JSF
3) Esse ManagedBean tem uma classe "Manager" (uma abstração para uma camada de serviços) injetada.
Exemplo:
[code]
public class UsuarioBean {
public UserManager mgr;
.
.
get and sets
}
[/code]
4) Esse UserManager é um bean do Spring que faz o papel de uma camada de serviços.
5) Nesse UserManager é injetado um DAO ( que também está mapeado como um bean do Spring ), por exemplo:
[code]
public class UserManagerImpl implements UserManager{
private UserDAO dao;
public void setUserDAO(UserDAO dao) {
this.dao = dao;
}
public User login(User user) {
return this.dao.login(user);
}
}
[/code]
6) E esse DAO que é um DAOHibernate ( extends HibernateDaoSupport ) acessa um POJO :
public class UserDAOHibernate extends HibernateDaoSupport implements UserDAO {
public User login(User user) {
DetachedCriteria c = DetachedCriteria.forClass(User.class);
c.add(Restrictions.eq("userName",user.getUserName()));
c.add(Restrictions.eq("password",user.getPassword()));
List results = getHibernateTemplate().findByCriteria(c);
if (results == null || results.isEmpty()){
return null;
}
return (User)results.get(0);
}
7) Esse POJO é uma classe JPA, mapeada como um @Entity.
Na aplicação b[/b] o projeto está divido na seguinte estrutura :
- Modulo EAR que encapsula módulos EJB e um módulo WAR.
Aqui moram minhas dúvidas.
- Dá Página até o banco é feito o seguinte caminho:
1) Minhas páginas XHTML + o Framework Faceletes para montar os templates.
2) A página acessa ManagedBeans do JSF
3) Esse ManagedBean faz um lookup numa classe Facade
Exemplo:
[code]
public class UsuarioBean {
private void listUsuarios() {
UsuarioFacadeLocal usuarioFacade = (UsuarioFacadeLocal) lookupUsuarioFacade();
List usuarios = usuarioFacade.findAll();
for (Iterator it = usuarios.iterator(); it.hasNext();) {
Usuario elem = (Usuario) it.next();
System.out.println(elem.getNome());
}
}
private UsuarioFacadeLocal lookupUsuarioFacade() {
try {
Context c = new InitialCon text();
return (UsuarioFacadeLocal) c.lookup("ModuloEAR/UsuarioFacade/local");
}
catch(NamingException ne) {
Logger.getLogger(getClass().getName()).log(Level.SEVERE,"exception caught" ,ne);
throw new RuntimeException(ne);
}
}
[/code]
4) Na implementação da classe UsuarioFacade eu tenho os métodos ( que seriam os métodos DAOs da arquitetura antiga ) para salvar/excluir/pesquisar.
[code]
@Stateless
public class UsuarioFacade implements UsuarioFacadeLocal {
@PersistenceContext
private EntityManager em;
/** Creates a new instance of UsuarioFacade */
public UsuarioFacade() {
}
public void create(Usuario usuario) {
em.persist(usuario);
}
public void edit(Usuario usuario) {
em.merge(usuario);
}
[/code]
Buenas,
Minhas dúvidas :
1) Esta arquitura [b](B)[/b] pode ser melhorada como ?
2) A arquitura [b](B)[/b] não está muito acoplada ?
3) Para cada Entity, por exemplo, Cliente, Fornecedor, Profissao eu teria que ter um EJB ?
Eu gostaria de opniões sugestões o que for possível.
Um grande abraço,
Leandro.