quinta-feira, 11 de março de 2010

Java + Hibernate: Another GenericDAO

Fazendo um catado pela net e implementando um pouco de código, este é o DAO genérico que estou utilizando nos meus primeiros projetos utilizando Hibernate3 e Spring.

Não sou nenhum expert nesses frameworks, mas boa parte das minhas necessidades foram supridas com esses métodos.

Primeiramente segue minha interface:

package persistence;

import java.util.List;
import java.util.Map;

/**
 *
 * @author felipe sartor
 */
public interface GenericDAO<T, PK>{

    public void save(T t);
    public void remove(T t);
    public T refresh(T t);
    public T find(PK id);
    public T findParam(String query, Map<String, Object> params);
    public List<T> findEntities();
    public List<T> findEntities(String query);
    public List<T> findEntitiesParam(String query, Map<String, Object> params);
    public List<T> findEntitiesParam(String query, Map<String, Object> params, int max, int atual);

}
E agora segue a sua implementação:
package persistence;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.Map;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import org.hibernate.Query;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

/**
 *
 * @author felipe sartor
 */
public abstract class GenericDAOImpl<T, PK extends Serializable >
 extends HibernateDaoSupport implements GenericDAO<T, PK>
{
 private Class<T> persistenceClass = null;

 //Construtor usando Reflection
 @SuppressWarnings("unchecked")
 public GenericDAOImpl() {
  this.persistenceClass = (Class<T>)
   ((ParameterizedType) getClass().getGenericSuperclass())
   .getActualTypeArguments()[0];
 }

 //Set para a classe que será persistida.
 protected void setPersistenceClass(Class<T> persistenceClass) {
  this.persistenceClass = persistenceClass;
 }

 public Class<T> getPersistenceClass() {
  return persistenceClass;
 }

 /* @Transactional dá a classe automaticamente o poder de transação.
  *
  * Atributo:
  * readOnly - otimizações para transações somente de leitura
  */
 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 public void save(T t) {
  getHibernateTemplate().saveOrUpdate(t);
 }

 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 public void remove(T t) {
  getHibernateTemplate().delete(t);
 }

 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 public T refresh(T t) {
  getHibernateTemplate().merge(t);

  return t;
 }

 public T find(PK id) {
  return (T) getHibernateTemplate().get(persistenceClass, id);
 }

 public T findParam(String query, Map<String, Object> params) {
  Query q = getSession().createQuery(query);
  for(String chave : params.keySet()){
   q.setParameter(chave, params.get(chave));
  }
  try{
   List l = q.list();
   if(l.size() > 1){
    throw new NonUniqueResultException();
   } else {
    return (T) l.get(0);
   }
  } catch(NoResultException nre){
   return null;
  } catch(NonUniqueResultException nure){
   nure.printStackTrace();
   return null;
  }
 }

 public List<T> findEntities() {
  return getHibernateTemplate().find(
   "from "+ persistenceClass.getSimpleName()
   );
 }

 public List<T> findEntities(String query) {
  Query q = getSession().createQuery(query);
  return q.list();
 }

 public List<T> findEntitiesParam(
  String query, Map<String, Object> params)
 {
  Query q = getSession().createQuery(query);
  for(String chave : params.keySet()){
   q.setParameter(chave, params.get(chave));
  }
  return q.list();
 }

 public List<T> findEntitiesParam(String query,
  Map<String, Object> params, int max, int atual)
 {
  Query q = getSession().createQuery(query)
   .setMaxResults(max).setFirstResult(atual);

  for(String chave : params.keySet()){
   q.setParameter(chave, params.get(chave));
  }
  return q.list();
 }

} 


Comentários são bem vindos. Enjoy! ;]


Keywords: Java, Hibernate, Hibernate3, Spring

Nenhum comentário:

BuscaPé, líder em comparação de preços na América Latina
 
BlogBlogs.Com.Br