package binky.reportrunner.dao.impl; import java.io.Serializable; import java.util.List; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import binky.reportrunner.dao.ReportRunnerDao; import binky.reportrunner.data.DatabaseObject; public class HibernateDaoImpl<T extends DatabaseObject<ID>, ID extends Serializable> implements ReportRunnerDao<T, ID> { private static final long serialVersionUID = 8003679043292862356L; private SessionFactory sessionFactory; private Class<T> clazz; private static Logger logger = Logger.getLogger(HibernateDaoImpl.class); public HibernateDaoImpl(Class<T> clazz) { this.clazz = clazz; logger.info("creating generic DAO for class " + clazz.getName()); } public void delete(ID id) { logger.trace("deleting object with ID: " + id+ " for class " + clazz.getName()); Session session = getSession(); T o = (T) getSession().get(clazz, id); if (o != null) session.delete(o); logger.trace("done deleting object with ID: " + id+ " for class " + clazz.getName()); } private Session getSession() { return this.sessionFactory.getCurrentSession(); } public T get(ID id) { logger.trace("getting object with ID: " + id + " for class " + clazz.getName()); return (T) getSession().get(clazz, id); } public List<T> getAll() { logger.trace("getting all for class " + clazz.getName()); return (List<T>) getSession().createCriteria(clazz) .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list(); } @SuppressWarnings("unchecked") public List<T> findByNamedQuery(String queryName, Object[] values) { Query q = getSession().getNamedQuery(queryName); if (values != null) { logger.trace("find by query: " + queryName+ " for class " + clazz.getName() + " param count " + values.length); for (int i = 0; i < values.length; i++) { q.setParameter(i, values[i]); } } return (List<T>) q.list(); } public ID saveOrUpdate(T entity) { Session session = getSession(); ID ret; logger.trace("saving object with ID: " +entity.getId()+ " for class " + clazz.getName()); // dealing with the caching while using the hibernate session in view // filter if (entity.getId() != null && this.get(entity.getId()) != null) { session.merge(entity); ret=entity.getId(); } else { ret=(ID)session.save(entity); } logger.trace("done saving object with ID: " +entity.getId()+ " for class " + clazz.getName()); return ret; } @SuppressWarnings("unchecked") @Override public List<T> findByNamedQuery(String queryName, Object[] values, int maxResults) { Query q = getSession().getNamedQuery(queryName); if (values != null) { logger.trace("find by query: " + queryName+ " for class " + clazz.getName() + " param count " + values.length + " max results " + maxResults); for (int i = 0; i < values.length; i++) { q.setParameter(i, values[i]); } } q.setMaxResults(maxResults); return (List<T>) q.list(); } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }