package pl.net.bluesoft.rnd.processtool.hibernate;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import pl.net.bluesoft.rnd.processtool.ProcessToolContext;
import pl.net.bluesoft.rnd.processtool.model.AbstractPersistentEntity;
import java.lang.reflect.ParameterizedType;
import java.util.Collection;
import java.util.List;
import java.util.logging.Logger;
/**
* @author: amichalak@bluesoft.net.pl
*/
public abstract class SimpleHibernateBean<T> implements HibernateBean<T> {
protected Logger logger = Logger.getLogger(getClass().getName());
protected Session session;
protected Class<T> entityType;
public SimpleHibernateBean() {
this(ProcessToolContext.Util.getThreadProcessToolContext().getHibernateSession());
}
public SimpleHibernateBean(Session session) {
this.session = session;
this.entityType = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public Session getSession() {
return session;
}
public void setSession(Session session) {
this.session = session;
}
@Override
public Class<T> getEntityType() {
return entityType;
}
@Override
public DetachedCriteria getDetachedCriteria() {
return DetachedCriteria.forClass(entityType);
}
@Override
public T loadById(Object id) {
return id != null ? findUnique(Restrictions.idEq(id)) : null;
}
@Override
public T findUnique(Criterion... queries) {
return findUnique(getDetachedCriteria(), queries);
}
protected T findUnique(DetachedCriteria criteria, Criterion... queries) {
if (queries != null) {
for (Criterion c : queries) {
criteria.add(c);
}
}
return (T) criteria.getExecutableCriteria(getSession()).uniqueResult();
}
@Override
public List<T> findAll() {
return findAll(null);
}
@Override
public List<T> findAll(Order order) {
DetachedCriteria criteria = getDetachedCriteria();
if (order != null) {
criteria.addOrder(order);
}
return findByCriteria(criteria);
}
@Override
public List<T> findByCriteria(DetachedCriteria criteria) {
return criteria.getExecutableCriteria(getSession()).list();
}
@Override
public void saveOrUpdate(Collection<T> objects) {
for (T object : objects) {
saveOrUpdate(object);
}
}
@Override
public void saveOrUpdate(T object) {
getSession().saveOrUpdate(object);
}
@Override
public void delete(Collection<T> objects) {
for (T object : objects) {
delete(object);
}
}
@Override
public void delete(T object) {
getSession().delete(object);
}
@Override
public T refresh(T object) {
return object != null ? loadById(getId(object)) : null;
}
protected Object getId(T object) {
if (object instanceof AbstractPersistentEntity) {
return ((AbstractPersistentEntity)object).getId();
}
throw new RuntimeException("Could not determine id for " + object.getClass().getName());
}
}