não sei se com a especificação nova existe a necessidade de um DAO…
R
rflprp
sem bem q meter um ejbql no bean vai ficar horrivel.
T
Tecnoage
e FICA… rs Ultimamente tenho visto os antigos DAOs serem renomeados para EAOs (Entity Access Object,s e não me engano.) e esses sim são EJBs injetados nos Sessions de fachada.
R
rflprp
então os daos viraram session beans ?
Malachai
Na boa, muito ruim isso, eu so queria separar o DAO pra poder ter uma camada de negocio e outra de persistencia, pra nao ficar tudo junto. Ses tem alguma sugestao em como implementar isso ? seria muito ruim usar um ejb pra negocio e outro pro dao ?
Imagine uma situação onde vc tem um Business de Usuario.java e quer fazer uma query que que retorne todos os usuarios baseado numa seria de criterios, consultas essas que um outro EJB vai precisar usar tambem. Desta forma eu teria que replicar tudo em vez de chamar essa query no DAO .
/** * @author Davy Diegues Duran * */publicclassJPADAO<T>implementsDAO<T>{privateEntityManagerem;privateClass<T>classe;publicJPADAO(EntityManagerem,Class<T>classe){this.em=em;this.classe=classe;}publicTatualiza(To)throwsSQLException{return(T)em.merge(o);}/* (non-Javadoc) * @see br.com.teste.dao.DAO#carrega(java.io.Serializable) */publicTcarrega(Serializablechave)throwsSQLException{returnem.find(classe,chave);}/* (non-Javadoc) * @see br.com.teste.dao.DAO#lista() */@SuppressWarnings("unchecked")publicList<T>lista()throwsSQLException{Queryq=em.createQuery("from "+classe);returnq.getResultList();}/* (non-Javadoc) * @see br.com.teste.dao.DAO#lista(java.lang.Object) */publicList<T>lista(To)throwsSQLException{// ainda não há criteria em JPAreturnnull;}/* (non-Javadoc) * @see br.com.teste.dao.DAO#lista(java.lang.Object, java.lang.String[]) */publicList<T>lista(To,String...propriedadesExcluidas)throwsSQLException{// ainda não há criteria em JPAreturnnull;}/* (non-Javadoc) * @see br.com.teste.dao.DAO#lista(java.lang.String, java.lang.Object[]) */@SuppressWarnings("unchecked")publicList<T>lista(Stringjpql,Object...parametros)throwsSQLException{Queryq=em.createQuery(jpql);intindex=0;for(Objectparametro:parametros)q.setParameter(index,parametro);returnq.getResultList();}/* (non-Javadoc) * @see br.com.teste.dao.DAO#remove(java.lang.Object) */publicvoidremove(To)throwsSQLException{em.remove(o);}}
só pra exemplificar, muito se discute sobre JPA ter substituindo a necessidade de DAO, mas não acho que seja uma realidade(em alguns é)
imagina colocar um metodo que usa um monte OQL (para generalizar) dentro do seu entity, não seria muito legal, ne?
ddduran
A não é pra criticar o codigo heim fiz rapidim :), sei que não devia ter SQLException para não expor que é um DAO de banco, etc, etc
mas até que ta bem feito vai
R
rflprp
não tme um esquema de externalizar as querys ?
no hibernate se nao me engano tem.
T
Tecnoage
eu também não gostei muito da alternativa de EJB DAOs, mas é a única coisa que achei em livros, embora como o pessoal ja dissse, há muitas controvérsias sobre o assunto…
então mais ai você vai deixar todas as querys em xml?
não estamos tantando fugir de usar tando xml e só usar ele quando realmente for aplicavel?
até concordo que nesses casos
update(To){em.merge(o);}
é meio desnecessario usar um dao, mas imagine que para executar um determinado metodo de acesso ao banco envolva mais ações, ai não vale a pena centralizar a logica?
ozielneto
Atualmente uso extensivamente EJB3 e JPA,
e sugestão do ddduran é mais viável.
Um outro mote para ter DAOs é a capacidade de
reutilização dos processo de persistências quando
o sistema começa a crescer muito, e em muitos casos
tem casos particulares de negócio.
A regra ainda é a mesma, separar a persistência
da camada de negócio e melhorar a componentização.
Bom trabalho.
T
Tecnoage
Malachai:
Na boa, muito ruim isso, eu so queria separar o DAO pra poder ter uma camada de negocio e outra de persistencia, pra nao ficar tudo junto. Ses tem alguma sugestao em como implementar isso ? seria muito ruim usar um ejb pra negocio e outro pro dao ?
Imagine uma situação onde vc tem um Business de Usuario.java e quer fazer uma query que que retorne todos os usuarios baseado numa seria de criterios, consultas essas que um outro EJB vai precisar usar tambem. Desta forma eu teria que replicar tudo em vez de chamar essa query no DAO .
O que vc está replicando??? Vc tem um DAO que é um EJB e é INJETADO em outro EJB sem a intrusão de um framework como Spring por exemplo. Todo o acesso ao SGBD fica centrtalizado ali. O que vc está replicando? Existe algum jeito melhor de separar camadas do que DI? Não entendi sua posição.
K
kruds
Tem a opção de deixar as querys acessiveis por toda aplicação atraves do entity.
Basta utilizar a anotação @NamedQuery(name = “nomeDaQuery”, query = “”) no seu entity bean.
Depois use o metodo EntityManager.createNamedQuery(“nomeDaQuery”).
Assim é uma forma de centralizar as queries e poder utilizar em varios locais, sem poluir muito o session bean.
OBS: Tenho duvidas em relacao a arquitetura de uma aplicação q utiliza JSF e EJB3.
Vou começar um projeto semana q vem e estou procurando ideias. Uma delas seria a respeito dessa arquitetura
de camada de negocio e camada de persistencia. Se tiverem mais ideias e exemplos postem ai p/ ter uma ideia.