Fórum DaoGenerico #27338
13/03/2010
Moderação direcionar a Dyego Souza Carmo
Como criar um DAOGenrico apartir da classe JPAUtil ?
package br.com.order.model.dao;
import java.io.Serializable;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
public class JPAUtil {
private static JPAUtil me;
private EntityManagerFactory emf;
private JPAUtil(){
emf = Persistence.createEntityManagerFactory("comercialpro");
}
public static JPAUtil getInstance(){
if(me == null)
me = new JPAUtil();
return me;
}
public EntityManager getEntityManager(){
EntityManager toReturn = emf.createEntityManager();
toReturn.getTransaction().begin();
return toReturn;
}
@SuppressWarnings("unchecked")
public <T> List<T> getList(Class<T> classToCast,String jpql, Object...parameters){
List<T> toReturn = null;
EntityManager em = getEntityManager();
Query qr = em.createQuery(jpql);
for (int i = 0; i < parameters.length; i++) {
qr.setParameter(i+1, parameters[i]);
}
toReturn = qr.getResultList();
em.getTransaction().commit();
em.close();
return toReturn;
}
public <T> T getEntity(Class<T> entityClass, Serializable pk){
EntityManager em = getEntityManager();
T toReturn = em.find(entityClass, pk);
em.getTransaction().commit();
em.close();
return toReturn;
}
public <T> T getEntity(Class<T> entityClass, String jpql){
EntityManager em = getEntityManager();
T toReturn = em.find(entityClass, jpql);
em.getTransaction().commit();
em.close();
return toReturn;
}
}
Posts
Na serie de video aulas "Desenvolvendo uma aplicação com Struts2" eu ensino EXATAMENTE isto , acho que seria interessante que a moderacao liberar as primeiras 4 aulas , tem como moderacao ?
Israel,
conforme contato via email, vc tem acesso aos videos mencionados pelo consultor.
Suas dúvidas foram retiradas, podemos encerrar o chamado?
Israel,
A sua questão foi respondida com as video aulas ?
Posso fechar este chamado ?
26/03/2010
Israel Barbosa
Aguarde só mais um momento que estou assistindo as video aulas, que alias são muito boas
guenta ae!!!
Senhor,
as aulas foram suficientes? Podemos encerrar o chamado?
08/04/2010
Israel Barbosa
Boa noite Dyego.
Desculpe pela demora, ja assisti as video aulas que resolveram quase todas minhas duvidas, porem ainda tenho algumas questões como a seguir:
No DaoGenerico adicionei os seguintes métodos:
@SuppressWarnings("unchecked")
public List<T> listAll(Class<T> classToCast) {
EntityManager em = JPAUtil.getInstance().getEntityManager();
Query query = em.createQuery("SELECT obj FROM " + classToCast.getSimpleName() + " obj");
List<T> list = query.getResultList();
return list;
}
O método acima lista todos os registros do objeto passado como parametro no DaoGenerico vc acha uma boa idéia deixa-lo ai ou vc acredita que seja melhor escrever um método que (listaTodos) em cada classe que estende o DaoGenerico?
@SuppressWarnings({ "unchecked", "hiding" })
public <T> List<T> listByNamedQuery(Class<T> classToCast, String queryName, Object...parameters) {
List<T> toReturn = null;
EntityManager em = JPAUtil.getInstance().getEntityManager();
Query query = em.createNamedQuery(queryName);
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i+1, parameters[i]);
}
toReturn = query.getResultList();
return toReturn;
}
Outro método que adicionei ao DaoGenerico foi o método acima, onde passo uma namedQuery como parametro, vc acha que este método pode substituir métodos do tipo findProducByDescription ou findProductByPrice nas subClasses do DaoGenerico?
Observe que desta forma no Objeto de Negocio por exemplo Product posso ter uma namedQuery chamada
findProductByDescription e findProductByPrice.
@SuppressWarnings({ "unchecked", "hiding" })
public <T> T getByNamedQuery(Class<T> entityClass, String queryName, Object...parameters){
EntityManager em = JPAUtil.getInstance().getEntityManager();
Query query = em.createNamedQuery(queryName);
for (int i = 0; i < parameters.length; i++) {
query.setParameter(i+1, parameters[i]);
}
T toReturn = null;
try {
toReturn = (T) query.getSingleResult();
} catch (NoResultException nre) {
try {
return entityClass.newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
em.getTransaction().commit();
em.close();
return toReturn;
}
Adicionei tambem este outro que faz quase a mesma coisa do método acima porem retorna uma unica instância do objeto em questão.
Qualquer problema ou sujestão me avise!
Pela atenção muito obrigado, Israel.
09/04/2010
Henrique Weissmann
Olá Israel,
"O método acima lista todos os registros do objeto passado como parametro no DaoGenerico vc acha uma boa idéia deixa-lo ai ou vc acredita que seja melhor escrever um método que (listaTodos) em cada classe que estende o DaoGenerico?"
Neste caso é desnecessário reimplementá-lo nas demais classes, pois a listagem de todos os registros é algo que, em si, já é suficientemente genérico ao ponto de desencorajar a especialização nos demais casos. Sendo assim, é melhor deixar como está mesmo, porque já está ótimo.
"Outro método que adicionei ao DaoGenerico foi o método acima, onde passo uma namedQuery como parametro, vc acha que este método pode substituir métodos do tipo findProducByDescription ou findProductByPrice nas subClasses do DaoGenerico?"
Neste caso a especialização já é um bom negócio, porque repare que os métodos de consulta que você está criando são específicos para determinadas classes suas, no caso, as que possuam atributos price ou description.
Sendo assim, eu manteria estes métodos especializados, mas manteria também este método para alguma consulta customizada que poderia vir a aparecer no futuro, aumentando assim a flexibilidade do seu sistema.
09/04/2010
Israel Barbosa
Vc tem mais alguma sugestão de melhora para este DaoGenerico?
09/04/2010
Henrique Weissmann
Oi Israel,
para este caso não.
09/04/2010
Israel Barbosa
Vc acha que seria necessário acrescentar no DaoGenerico mais um método que busca o ultimo id para entidades
que possuem chave primaria composta? Ou eu faço isto na subclasse que precisar?
09/04/2010
Henrique Weissmann
Neste caso você vai estar tratando de uma especificidade. Sendo assim é bem mais interessante implementar em uma subclasse.
09/04/2010
Israel Barbosa
Blz então pode fechar este chamado.
Obrigado pela paciencia e pelas respostas!