Fórum DaoGenerico #27338

13/03/2010

0

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

Responder

Posts

18/03/2010

Dyego Carmo

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 ?
Responder

Gostei + 0

24/03/2010

Devmedia

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

Gostei + 0

26/03/2010

Dyego Carmo

Israel,

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

Posso fechar este chamado ?

Responder

Gostei + 0

26/03/2010

Israel Barbosa

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

Gostei + 0

08/04/2010

Devmedia

Senhor,
as aulas foram suficientes? Podemos encerrar o chamado?
Responder

Gostei + 0

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.
Responder

Gostei + 0

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.
Responder

Gostei + 0

09/04/2010

Israel Barbosa

Vc tem mais alguma sugestão de melhora para este DaoGenerico?
Responder

Gostei + 0

09/04/2010

Henrique Weissmann

Oi Israel,

para este caso não.
Responder

Gostei + 0

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?
Responder

Gostei + 0

09/04/2010

Henrique Weissmann

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

Gostei + 0

09/04/2010

Israel Barbosa

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

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar