Arquivo

Posts Tagged ‘Persistência’

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