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:
Postar um comentário