Arquivo

Archive for julho 18, 2011

Generic Data Access Object com Eclipse Link

julho 18, 2011 Deixe um comentário

Olá, nesse post estará um código fonte de um Generic DAO utilizando a biblioteca de persistência Eclipse Link (somente o código da classe Generic DAO, não entrarei nos detalhes de configuração da conexão com banco de dados).

É possível realizar o download da biblioteca em: EclipseLink Home

O mais importante antes de construir o DAO Genérico, é ter conhecimento sobre Generics e Java Reflection, pois apresentam-se dois problemas:

  • Tipo dos parâmetros nos métodos: por exemplo no método inserir, você deve passar um objeto do tipo da entidade que se deseja adicionar;
  • Obter classe da entidade:  por exemplo no get você precisa saber qual o tipo da entidade a ser retornada;
Para resolver o primeiro utilizamos Generics, que permite passar o tipo no construtor, permite que ela receba qualquer tipo (exceto os primários).
E o segundo utilizamos o Java Reflection, a partir da classe Class, que permite armazenar informações sobre qualquer classe Java.
Eis o código do DAO Genérico:
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;

public class GenericDAO <T>{
 /*cria um gerenciador de entidades, a partir da fábrica de gerenciadores de entidade
 Obs: não utilizar static, pois pode gerar problemas em relacionamentos Many-To-Many */
 private EntityManager em = Persistence.createEntityManagerFactory("UP").createEntityManager();
 //Atributo do tipo classe utilizado no Java Reflection
 private Class classe;

 public GenericDAO(Class classe) {
      //faz o atributo classe receber a classe da entidade, que deve ser passada no construtor      
      this.classe = classe;
 }

//Método para inserir um registro no banco de dados a partir de um objeto
 public void insert(T entidade){
      em.getTransaction().begin();
      em.persist(entidade);
      em.getTransaction().commit();
 }

//Método para atualizar um registro no banco de dados a partir de um objeto
 public void update(T entidade){
      em.getTransaction().begin();
      em.merge(entidade);
      em.getTransaction().commit();
 }

//Método para obter um registro no banco de dados a partir de um id
 public T get(int id){
      return (T)em.find(classe, id);
 }

//Método para remover um registro no banco de dados a partir de um id
 public void remove(int id){
      T entidade = get(id);
      if(entidade!=null){
      em.getTransaction().begin();
      em.remove(entidade);
      em.getTransaction().commit();
 }
 }

//Retorna todos os registros no banco de dados da tabela equivalente a entidade passada por parâmetro
 public List<T> list(){
       return em.createQuery("SELECT e FROM " + classe.getSimpleName() + " e").getResultList();
 }
}

Crie um site como este com o WordPress.com
Comece agora