package nl.topicus.konijn.data.dao.hibernate;
import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import nl.topicus.konijn.data.dao.interfaces.IBaseDao;
import nl.topicus.konijn.data.entity.BaseEntity;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.persist.Transactional;
/**
* Base data access helper class
*
* @author Joost Limburg
*
* @param <T>
*/
public abstract class BaseDao<T extends BaseEntity> implements IBaseDao<T> {
@Inject
protected Provider<EntityManager> emp;
private Class<T> persistentClass;
public BaseDao(final Class<T> clazz) {
persistentClass = clazz;
}
/**
* Constructor for dependency injection.
*
* @param persistentClass
* the class type you'd like to persist.
*/
@SuppressWarnings("unchecked")
protected BaseDao() {
Class<?> cl = getClass();
if (Object.class.getSimpleName().equals(
cl.getSuperclass().getSimpleName())) {
throw new IllegalArgumentException(
"Default constructor does not support direct instantiation");
}
while (!BaseDao.class.getSimpleName().equals(
cl.getSuperclass().getSimpleName())) {
// case of multiple inheritance, we are trying to get the first
// available generic info
if (cl.getGenericSuperclass() instanceof ParameterizedType) {
break;
}
cl = cl.getSuperclass();
}
if (cl.getGenericSuperclass() instanceof ParameterizedType) {
persistentClass = (Class<T>) ((ParameterizedType) cl
.getGenericSuperclass()).getActualTypeArguments()[0];
}
}
/**
* @param emp
*/
public void setEmp(Provider<EntityManager> emp) {
this.emp = emp;
}
/*
* (non-Javadoc)
*
* @see org.rapin.dddabs.model.IEntity#find(java.io.Serializable)
*/
public T find(Long id) {
return emp.get().find(persistentClass, id);
}
/*
* (non-Javadoc)
*
* @see org.rapin.ddd.model.IEntity#findAll()
*/
@SuppressWarnings("unchecked")
public List<T> findAll() {
List<T> list = emp.get()
.createQuery("FROM " + persistentClass.getSimpleName())
.getResultList();
if (list == null)
list = new ArrayList<T>();
return list;
}
public List<T> findIn(List<Long> idList) {
CriteriaBuilder cb = emp.get().getCriteriaBuilder();
CriteriaQuery<T> query2 = cb.createQuery(persistentClass);
Root<T> fetch2 = query2.from(persistentClass);
query2.where(fetch2.<Long> get("id").in(idList));
// execute the query
List<T> result = emp.get().createQuery(query2).getResultList();
return result;
}
/*
* (non-Javadoc)
*
* @see org.rapin.dddabs.model.IEntity#save(java.lang.Object)
*/
@Transactional
public T merge(T object) {
return emp.get().merge(object);
}
/*
* (non-Javadoc)
*
* @see org.rapin.dddabs.model.IEntity#save(java.lang.Object)
*/
@Transactional
public void save(T object) {
emp.get().persist(object);
}
/*
* (non-Javadoc)
*
* @see org.rapin.dddabs.model.IEntity#remove(java.io.Serializable)
*/
@Transactional
public void remove(Long id) {
EntityManager em = emp.get();
em.remove(em.find(persistentClass, id));
}
}