package qa.qcri.aidr.manager.repository.impl; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; import java.util.List; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.orm.hibernate4.HibernateCallback; import org.springframework.orm.hibernate4.HibernateTemplate; import qa.qcri.aidr.manager.repository.GenericRepository; public abstract class GenericRepositoryImpl<T, ID extends Serializable> implements GenericRepository<T, ID> { private Class<T> entityType; @Autowired private HibernateTemplate hibernateTemplate; public GenericRepositoryImpl() { this.entityType = getEntityType(); } @SuppressWarnings("unchecked") protected final Class<T> getEntityType() { Class<? extends Object> thisClass = getClass(); Type genericSuperclass = thisClass.getGenericSuperclass(); if( genericSuperclass instanceof ParameterizedType ) { Type[] argumentTypes = ((ParameterizedType) genericSuperclass).getActualTypeArguments(); Class<T> entityBeanType = (Class<T>)argumentTypes[0]; return entityBeanType; } else { return null; } } @Override @SuppressWarnings(value="unchecked") public T findById(ID id) { return (T) hibernateTemplate.get(entityType.getName(), id); } @SuppressWarnings({ "unchecked", "rawtypes" }) public List<T> findAll() { return hibernateTemplate.execute(new HibernateCallback<List<T>>() { public List<T> doInHibernate(Session session) throws HibernateException { Criteria criteria = session.createCriteria(GenericRepositoryImpl.this.entityType); return criteria.list(); } }); } @Override public void save(T entity) { hibernateTemplate.save(entity); } @Override public void update(T entity) { hibernateTemplate.update(entity); } @Override public void delete(T entity) { hibernateTemplate.delete(entity); } public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } }