generic.dao - roberto-oliveira/java GitHub Wiki

package br.gov.ms.defensoria.comum.generics.dao;

import java.io.Serializable; import java.sql.Connection; import java.sql.SQLException; import java.util.List;

import javax.ejb.TransactionAttribute; import javax.ejb.TransactionAttributeType; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.TypedQuery; import javax.sql.DataSource;

import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order;

import br.gov.ms.defensoria.comum.generic.audit.Auditavel; import br.gov.ms.defensoria.comum.generics.IGenericEntity;

/**

  • Classe DAO generica para acesso aos dados.
  • @author codigosfontes.com.br */

public abstract class GenericDAO implements Serializable {

/**
 * 
 */
private static final long serialVersionUID = 1L;

protected EntityManager entityManager;

protected DataSource dataSource;

protected Class<T> persistentClass;

public GenericDAO(Class<T> persistenceClass) {
	this.persistentClass = persistenceClass;
}

public Class<T> getPersistentClass() {
	return this.persistentClass;
}

public void excluir(T entity) {
	entity = getEntityManager().merge(entity);
	getEntityManager().remove(entity);
}

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public boolean remove(T obj) {
	try {
		obj = getEntityManager().merge(obj);
		getEntityManager().remove(obj);
		return true;
	} catch (Exception e) {
		e.printStackTrace();
		return false;
	}
}

public T buscarPorId(Long id) {
	try {
		return (T) getEntityManager().find(getPersistentClass(), id);
	} catch (NoResultException noResultException) {
		return null;
	}
}

@SuppressWarnings({ "unchecked", "rawtypes" })
public T buscarPorId(Long id, Class clazz) {
	try {
		return (T) getEntityManager().find(clazz, id);
	} catch (NoResultException noResultException) {
		return null;
	}
}

/**
 * Recupera o objeto dando join em todos os relacionamentos
 */
@SuppressWarnings("unchecked")
public T buscarUmPorCampoCompleto(String campo, Object valor) {
	try {
		return (T) getEntityManager()
				.createQuery("SELECT obj FROM " + persistentClass.getName() + " obj " + "FETCH ALL PROPERTIES "
						+ "WHERE " + campo + " = :_valor ")
				.setParameter("_valor", valor).setMaxResults(1).getSingleResult();
	} catch (NoResultException noResultException) {
		return null;
	}
}

public Long count() {
	try {
		TypedQuery<Long> query = getEntityManager().createQuery("SELECT COUNT(*) FROM " + persistentClass.getName(),
				Long.class);
		return (Long) query.getSingleResult();
	} catch (NoResultException noResultException) {
		return 0L;
	}
}

@SuppressWarnings("unchecked")
public List<T> buscarTodos() {
	return getSession().createCriteria(persistentClass).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
}

public T salvar(T entity) {
	entity = getEntityManager().merge(entity);
	return entity;

}

@SuppressWarnings("unchecked")
public List<T> buscarListaPorCriterio(Criterion... criterion) {
	Criteria crit = getSession().createCriteria(getPersistentClass());
	for (Criterion c : criterion) {
		crit.add(c);
	}
	crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
	return crit.list();
}

@SuppressWarnings("unchecked")
public List<T> buscarListaPorCriterio(Class<T> persistentClass, Criterion... criterion) {
	Criteria crit = getSession().createCriteria(persistentClass);
	for (Criterion c : criterion) {
		crit.add(c);
	}
	crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
	return crit.list();
}

@SuppressWarnings("unchecked")
public List<T> buscarListaPorCriterio(Order order, Criterion... criterion) {
	Criteria crit = getSession().createCriteria(getPersistentClass());
	for (Criterion c : criterion) {
		crit.add(c);
	}

	crit.addOrder(order);
	crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

	return crit.list();
}

public void detach(IGenericEntity entity) {
	getSession().evict(entity);
}

@SuppressWarnings("unchecked")
public T buscarUmPorCriterio(Criterion... criterion) {
	Criteria crit = getSession().createCriteria(getPersistentClass());
	for (Criterion c : criterion) {
		crit.add(c);
	}
	return (T) crit.uniqueResult();
}

/**
 * Retorna uma Session do hibernate retirada do EntityManager do JPA
 */
public Session getSession() {
	return (Session) getEntityManager().unwrap(Session.class);
}

/**
 * Retorna a conexao JDBC com o Postgres
 */
public Connection getConnection() {
	try {
		return getDataSource().getConnection();
	} catch (SQLException ex) {
		return null;
	}
}

public EntityManager getEntityManager() {
	if (entityManager == null)
		throw new IllegalStateException("EntityManager não pode setar o DAO antes de ser usado.");
	return entityManager;
}

@Auditavel
public T inserir(T entity) {
	return getEntityManager().merge(entity);
}

@Auditavel
public T atualizar(T entity) {
	return getEntityManager().merge(entity);
}

public void remover(Long PK) {
	excluir(buscarPorId(PK));
}

protected DataSource getDataSource() {
	return dataSource;
}

protected void setDataSource(DataSource dataSource) {
	this.dataSource = dataSource;
}

public void setEntityManager(EntityManager entityManager) {
	this.entityManager = entityManager;
}

}

⚠️ **GitHub.com Fallback** ⚠️