4
8/20/2019 Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português http://slidepdf.com/reader/full/java-como-fazer-a-classe-genericdao-utilizando-o-hibernate-stack-overflow 1/4 regi strar l og-i n tou r aj ud a  _ Stack Overflow em Português é um site de perguntas e respostas para programadores profissionais e entusiastas. É 100% gratuito e não requer registro. Registrar-se Veja como funciona: Qualquer pessoa pode fazer um a pergunta Qualquer um pode responder  As m elhores res pos tas recebem votos positivos e sobem para os primeiros lugares Como fazer a classe GenericDAO utilizando o Hibernate? Eu queria saber qual a melhor forma de fazer uma Dao genérica de um projeto, utilizando o Hibernate e o JPA em java. Isso tudo para não f icar montando uma DAO da seguinte forma pra cada objeto que irá pers istir no banco: public class ProdutoDao { private final EntityManager em; @Inject public ProdutoDao(EntityManager  em) { this.em = em; } public void adiciona(Produto p r od ut o) {  em.getTransaction().begin();  em.persist(produto);  em.getTransaction().commit(); } public void remove(Produto p r od ut o) {  em.getTransaction().begin();  em.remove(busca(produto));  em.getTransaction().commit(); } public Produto busca(Produto p r od ut o) { return em.find(Produto.class, produto.getId()); } @SuppressWarnings ("unchecked" ) public List<Produto> l is ta () { return em.createQuery("select p from Produto p").getResultList(); } }  jav a hibernate jpa jpa-2.0 padrão-dao editada 21/07/15 às 2:43 perguntada 21/07/15 às 2:36 Tiago Ferezin 516 17  – Esses links podem te ajud ar: e wehavescience.com/2013/02/24/… blog.caelum.com.br/brincando- . Boa sorte! com -ge neri cs-o -bi zarreg ene ri cdao M uri lo A. Ol ivei ra 21/07/15 às 12:24 2 Respostas @Inject protected EntityManager entityManager; private Class<T> persistedClass; protected GenericDao() { } protected GenericDao(Class<T> persistedClass) { this(); public abstract class GenericDao <T, I extends Serializable > {

Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

Embed Size (px)

Citation preview

Page 1: Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

8/20/2019 Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

http://slidepdf.com/reader/full/java-como-fazer-a-classe-genericdao-utilizando-o-hibernate-stack-overflow 1/4

regi strar l og-i n tou r aj ud a

 _ Stack Overflow em Português é umsite de perguntas e respostas paraprogramadores profissionais eentusiastas. É 100% gratuito e nãorequer registro.

Registrar-se

Veja como funciona:

Qualquer 

pessoa pode

fazer uma

pergunta

Qualquer um

pode responder 

 As melhores respos tas

recebem votos positivos e

sobem para os primeiros

lugares

Como fazer a classe GenericDAO utilizando o Hibernate?

Eu queria saber qual a melhor forma de fazer uma Dao genérica de um projeto, utilizando o Hibernate e oJPA em java.

Isso tudo para não f icar montando uma DAO da seguinte forma pra cada objeto que irá pers istir nobanco:

public class   ProdutoDao {

private final  EntityManager em;

@Inject

public   ProdutoDao(EntityManager em) {

this.em = em;

}

public void adiciona(Produto produto) {

 em.getTransaction().begin();

 em.persist(produto);

 em.getTransaction().commit();

}

public void remove(Produto produto) {

 em.getTransaction().begin();

 em.remove(busca(produto));

 em.getTransaction().commit();

}

public   Produto busca(Produto produto) {

return em.find(Produto.class, produto.getId());

}

@SuppressWarnings("unchecked")

public   List<Produto> lista() {

return em.createQuery("select p from Produto p").getResultList();

}

}

 jav a hibernate jpa jpa-2.0 padrão-dao

editada 21/07/15 às 2:43 perguntada 21/07/15 às 2:36

Tiago Ferezin

516 17

 –

Esses li nks podem te ajud ar: ewehavescience.com/2013/02/24/… blog.caelum.com.br/brincando-

. Boa sorte!com -ge neri cs-o -bi zarreg ene ri cdao M uri lo A. Ol ivei ra 21/07/15 às 12:24

2 Respostas

@Inject

protected   EntityManager entityManager;

private   Class<T> persistedClass;

protected   GenericDao() {

}

protected   GenericDao(Class<T> persistedClass) {

this();

public 

abstract 

class 

GenericDao<T, I extends 

Serializable> {

Page 2: Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

8/20/2019 Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

http://slidepdf.com/reader/full/java-como-fazer-a-classe-genericdao-utilizando-o-hibernate-stack-overflow 2/4

this.persistedClass = persistedClass;

}

public T salvar(@Valid T entity) {

EntityTransaction t = entityManager.getTransaction();

  t.begin();

  entityManager.persist(entity);

  entityManager.flush();

  t.commit();

return entity;

}

public T atualizar(@Valid T entity) {

EntityTransaction t = entityManager.getTransaction();

  t.begin();

  entityManager.merge(entity);

  entityManager.flush();

  t.commit();

return entity;

}

public void remover(I id) {

  T entity = find(id);

EntityTransaction tx = entityManager.getTransaction();

  tx.begin();

  T mergedEntity = entityManager.merge(entity);

  entityManager.remove(mergedEntity);

  entityManager.flush();

  tx.commit();

}

public   List<T> getList() {

CriteriaBuilder builder = entityManager.getCriteriaBuilder();

CriteriaQuery<T> query = builder.createQuery(persistedClass);

  query.from(persistedClass);return entityManager.createQuery(query).getResultList();

}

public T encontrar(I id) {

return entityManager.find(persistedClass, id);

}

}

Eu sempre utilizo esse. Vê se te ajuda.

Seu DAO ficar ia assim:

public class   ProdutoDao   extends   GenericDao<Produto,   Long> {

public   ProdutoDao() {

super(Produto.class);

}

}

editada 21/07/15 às 13:20 respondida 21/07/15 às 13:06

Cassio Danil o

96 2

Eu utilizo algo similar ao que foi indicado pelo @Cassio Danilo. Só que as vezes é interessanteque uma DAO seja implementada tanto via JPA quando AdHoc (JDBC).

 A minha sugestão é a seguinte:

Crie uma interface para a DAO que sugira os métodos de interação principais com a entidade(CRUD)

1.

Crie uma classe abstrata de suporte para cada tipo de implementação: JPA e AdHoc.2.

Ficaria da seguinte forma:

Dao.class

public interface   Dao<E extends   Serializable, I> {

  E consultarPorId(I id);

void inserir(E entity);

  E atualizar(E entity);

void excluir(E entity);

List<E> consultarTodos();

}

Page 3: Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

8/20/2019 Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

http://slidepdf.com/reader/full/java-como-fazer-a-classe-genericdao-utilizando-o-hibernate-stack-overflow 3/4

AbstractJPADao.class

@Named

@Transactional(propagation =   Propagation.MANDATORY)

public abstract class   AbstractJPADao<E extends   Serializable, I>   extends

AbstractJPASupport   implements

Dao<E, I> {

private final   Class<E> entityClass;

protected   AbstractJPADao(Class<E> entityClass) {

this.entityClass = entityClass;

}

public   CriteriaQuery<E> getCriteriaQuery() {return this.getEntityManager().getCriteriaBuilder().createQuery(entityClass);

}

@Override

public void excluir(E entity) {

this.getEntityManager().remove(entity);

}

@SuppressWarnings("unchecked")

@Override

public   List<E> consultarTodos() {

return this.getEntityManager().createQuery(

String.format("from %s",   this.entityClass.getName()))

.getResultList();

}

@Override

public E consultarPorId(I id) {

return this.getEntityManager().find(entityClass, id);

}

@Override

public void inserir(E entity) {

this.getEntityManager().persist(entity);

}

@Override

public E atualizar(E entity) {

return this.getEntityManager().merge(entity);

}

}

AbstractJPASupport.class

@Named

@Transactional(propagation =   Propagation.MANDATORY)

public abstract class   AbstractJPASupport {

private  EntityManager entityManager;

public   AbstractJPASupport() {

}

public   CriteriaBuilder getCriteriaBuilder() {

return  entityManager.getCriteriaBuilder();

}

public   EntityManager getEntityManager() {

return entityManager;

}

@PersistenceContext

@Inject

public void setEntityManager(EntityManager entityManager) {

this.entityManager = entityManager;

}

@PostConstruct

protected void init() {

  checkState(this.entityManager !=   null,

"Atencao! Entity Manager nao inicializado.");

}

}

 Atente para o detalhe de . Se estiver utilizando Spring, é um meio interessante de garantir um requisito não funcional para que a suaDAO não seja executada fora de um ambiente transacionado.

@Transactional(propagation = Propagation.MANDATORY)

 Agora, o suporte para implementação JDBC:

AbstractJDBCDao.class

Page 4: Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

8/20/2019 Java - Como Fazer a Classe GenericDAO Utilizando o Hibernate- - Stack Overflow Em Português

http://slidepdf.com/reader/full/java-como-fazer-a-classe-genericdao-utilizando-o-hibernate-stack-overflow 4/4