Upload
anderson-kerlly
View
214
Download
0
Embed Size (px)
Citation preview
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();
f
public
abstract
class
GenericDao<T, I extends
Serializable> {
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();
}
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
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