package com.rjconsultores.ventaboletos.dao.hibernate; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.Collection; import java.util.List; import com.rjconsultores.ventaboletos.dao.GenericDAO; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.hibernate.engine.LoadQueryInfluencers; import org.hibernate.engine.SessionFactoryImplementor; import org.hibernate.impl.CriteriaImpl; import org.hibernate.impl.SessionImpl; import org.hibernate.loader.OuterJoinLoader; import org.hibernate.loader.criteria.CriteriaLoader; import org.hibernate.persister.entity.OuterJoinLoadable; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; /** * * @author gleimar */ @SuppressWarnings("unchecked") public class GenericHibernateDAO extends HibernateDaoSupport implements GenericDAO { public long start = System.currentTimeMillis(); public GenericHibernateDAO() { this.persistentClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0]; } // Classe que será persistida. private Class persistentClass; public Class getPersistentClass() { return this.persistentClass; } @Override public void borrar(T entity) { try { this.getHibernateTemplate().delete(entity); } catch (final HibernateException ex) { throw convertHibernateAccessException(ex); } } @Override public T obtenerID(ID id) { try { return (T) this.getHibernateTemplate().get(getPersistentClass(), id); } catch (final HibernateException ex) { throw convertHibernateAccessException(ex); } } @Override public List obtenerTodos() { try { return this.getHibernateTemplate().loadAll(getPersistentClass()); } catch (final HibernateException ex) { throw convertHibernateAccessException(ex); } } @Override public T suscribir(T entity) { try { this.getHibernateTemplate().save(entity); return entity; } catch (final HibernateException ex) { throw convertHibernateAccessException(ex); } } protected List findByCriteria(Criterion... criterion) { try { Criteria crit = this.getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(getPersistentClass()); for (Criterion c : criterion) { crit.add(c); } return crit.list(); } catch (final HibernateException ex) { throw convertHibernateAccessException(ex); } } protected Criteria makeCriteria() { return this.getHibernateTemplate().getSessionFactory().getCurrentSession().createCriteria(getPersistentClass()); } public T actualizacion(T entity) { return getHibernateTemplate().merge(entity); } public Long count(String campo, Object o) { Criteria c = this.makeCriteria(); c.add(Restrictions.eq(campo, o)); c.add(Restrictions.eq("activo", Boolean.TRUE)); c.setProjection(Projections.rowCount()); return HibernateFix.count(c.list()); } public void suscribirTodos(Collection entidades) { getHibernateTemplate().saveOrUpdateAll(entidades); } /* * Metodo que retorna o sql do criteria passado * para uso em debug e auxilio nas analises * */ public String getCriteriaSql( Criteria c, Session se) { try { CriteriaImpl ci = (CriteriaImpl) c; SessionImpl s = (SessionImpl) se; SessionFactoryImplementor factory = (SessionFactoryImplementor) s.getSessionFactory(); String[] implementors = factory.getImplementors(ci.getEntityOrClassName()); LoadQueryInfluencers lqis = new LoadQueryInfluencers(); CriteriaLoader loader = new CriteriaLoader((OuterJoinLoadable) factory.getEntityPersister(implementors[0]), factory, ci, implementors[0], lqis); Field f = OuterJoinLoader.class.getDeclaredField("sql"); f.setAccessible(true); String sql = (String) f.get(loader); return sql; } catch (Exception e) { return "exception "+e.getMessage(); } } /* * Metodo adicionado para retornar em o tempo de execucao * de cada metodo chamado, sendo chamado nas implementacoes * e printado via log.debug, para que possa ser analizado * qualquer eventual demora na execução * */ public String printInfo(String method, long start) { long milliseconds = System.currentTimeMillis() - start; long minutes = (milliseconds / 1000) / 60; long seconds = (milliseconds / 1000) % 60; String info = String.format("[%s] %d minutos e %d segundos", method, minutes, seconds); if ((minutes + seconds) == 0) { info = String.format("[%s] %d milissegundos", method, milliseconds); } return info; } public static List castList(Class clazz, Collection rawCollection) throws ClassCastException { List result = new ArrayList(rawCollection.size()); for (Object o : rawCollection) { result.add(clazz.cast(o)); } return result; } }