package +zoccolo+.+rail+; import +zoccolo+.generic.GenericCrud; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.List; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Example; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.impl.SessionFactoryImpl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.dao.DataAccessException; import org.springframework.orm.hibernate3.HibernateTemplate; import org.springframework.transaction.annotation.Transactional; @Transactional("+rail+TxManager") public abstract class Generic+Rail+DaoImpl implements GenericCrud { private final Class persistentClass; @Autowired(required = true) @Qualifier("+rail+Template") protected HibernateTemplate +rail+Template; @SuppressWarnings("unchecked") public Generic+Rail+DaoImpl() { this.persistentClass = (Class) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } public void clear() throws DataAccessException { +rail+Template.clear(); } public void delete(T entity) throws DataAccessException { +rail+Template.delete(entity); } public void deleteById(ID id) throws DataAccessException { T entity = +rail+Template.get(persistentClass, id); +rail+Template.delete(entity); } public List findAll() throws HibernateException { return findByCriteria(); } @SuppressWarnings("unchecked") public List findAll(Order order) throws HibernateException { Criteria crit = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass); crit.addOrder(order); return crit.list(); } @SuppressWarnings("unchecked") public List findByCriteria(Order order, Criterion... criterion) throws HibernateException { Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass).addOrder(order); for (Criterion c : criterion) { criteria.add(c); } return criteria.list(); } @SuppressWarnings("unchecked") public List findByCriteria(Criterion... criterion) throws HibernateException { Criteria criteria = +rail+Template.getSessionFactory() .getCurrentSession().createCriteria(persistentClass); for (Criterion c : criterion) { criteria.add(c); } return criteria.list(); } @SuppressWarnings("unchecked") public String getDialect() throws HibernateException { SessionFactoryImpl sfi = (SessionFactoryImpl) +rail+Template .getSessionFactory(); return sfi.getDialect().toString(); } @SuppressWarnings("unchecked") public List oneColumnQuery(final String q) throws HibernateException { Session session = +rail+Template.getSessionFactory() .getCurrentSession(); Query query = session.createQuery(q); return (List) query.list(); } @SuppressWarnings("unchecked") public List manyColumnQuery(final String q) throws HibernateException { Session session = +rail+Template.getSessionFactory() .getCurrentSession(); Query query = session.createQuery(q); return (List) query.list(); } @Override public Integer howManyRows(Criterion... criterion) throws DataAccessException { Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass) .setProjection(Projections.rowCount()); for (Criterion c : criterion) { criteria.add(c); } return (Integer)criteria.uniqueResult(); } @Override public Integer howManyRowsAlias(String p, String alias, Criterion... criterion) throws DataAccessException { Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass) .setProjection(Projections.rowCount()); criteria.createAlias(p, alias); for (Criterion c : criterion) { criteria.add(c); } return (Integer)criteria.uniqueResult(); } @Override public Integer howManyRows() throws DataAccessException { Criteria criteria = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass) .setProjection(Projections.rowCount()); return (Integer)criteria.uniqueResult(); } @SuppressWarnings("unchecked") public T findUniqueByCriteria(Criterion... criterion) throws HibernateException { Criteria crit = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass); for (Criterion c : criterion) { crit.add(c); } return (T) crit.uniqueResult(); } @SuppressWarnings("unchecked") public List findByExample(T exampleInstance, String[] excludeProperty) throws HibernateException { Criteria crit = +rail+Template.getSessionFactory().getCurrentSession() .createCriteria(persistentClass); Example example = Example.create(exampleInstance); for (String exclude : excludeProperty) { example.excludeProperty(exclude); } crit.add(example); return crit.list(); } public T findById(ID id, boolean lock) throws DataAccessException { T entity; if (lock) entity = +rail+Template.load(persistentClass, id, LockMode.UPGRADE); else entity = +rail+Template.load(persistentClass, id); return entity; } public void flush() throws DataAccessException { +rail+Template.flush(); } public T makePersistent(T entity) throws DataAccessException { +rail+Template.saveOrUpdate(entity); return entity; } public void makeTransient(T entity) throws DataAccessException { +rail+Template.delete(entity); } public void save(T entity) throws DataAccessException { +rail+Template.save(entity); } public void saveOrUpdate(T entity) throws DataAccessException { +rail+Template.saveOrUpdate(entity); } public void update(T entity) throws DataAccessException { +rail+Template.update(entity); } public void merge(T entity) throws DataAccessException { +rail+Template.merge(entity); } /* screwdriver_knife */ }