DaoGenerico

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;
 }
}
Israel Barbosa

Israel Barbosa

Curtidas 0

Respostas

Dyego Carmo

Dyego Carmo

13/03/2010

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 ?
GOSTEI 0
Devmedia

Devmedia

13/03/2010

Israel,
conforme contato via email, vc tem acesso aos videos mencionados pelo consultor.
Suas dúvidas foram retiradas, podemos encerrar o chamado?
GOSTEI 0
Dyego Carmo

Dyego Carmo

13/03/2010

Israel,

A sua questão foi respondida com as video aulas ?

Posso fechar este chamado ?

GOSTEI 0
Israel Barbosa

Israel Barbosa

13/03/2010

Aguarde só mais um momento que estou assistindo as video aulas, que alias são muito boas   guenta ae!!!
GOSTEI 0
Devmedia

Devmedia

13/03/2010

Senhor,
as aulas foram suficientes? Podemos encerrar o chamado?
GOSTEI 0
Israel Barbosa

Israel Barbosa

13/03/2010

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.
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

13/03/2010

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.
GOSTEI 0
Israel Barbosa

Israel Barbosa

13/03/2010

Vc tem mais alguma sugestão de melhora para este DaoGenerico?
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

13/03/2010

Oi Israel,

para este caso não.
GOSTEI 0
Israel Barbosa

Israel Barbosa

13/03/2010

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?
GOSTEI 0
Henrique Weissmann

Henrique Weissmann

13/03/2010

Neste caso você vai estar tratando de uma especificidade. Sendo assim é bem mais interessante implementar em uma subclasse.
GOSTEI 0
Israel Barbosa

Israel Barbosa

13/03/2010

Blz então pode fechar este chamado.   Obrigado pela paciencia e pelas respostas!
GOSTEI 0
POSTAR