package org.test4j.fortest.hibernate;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
public class BaseServiceImpl<T extends BaseBean> implements BaseService<T> {
protected Class<T> claz;
protected SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
public BaseServiceImpl() {
this.claz = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@SuppressWarnings("unchecked")
public <E extends BaseBean> E getBeanById(Class<E> clazz, int id) {
String hql = "from " + clazz.getName()
+ " as bean where bean.id=:id and (bean.deleted=false or bean.deleted is null)";
Query q = this.sessionFactory.getCurrentSession().createQuery(hql);
q.setInteger("id", id);
E bean = (E) q.uniqueResult();
return bean;
}
public T getBeanById(int id) {
return this.getBeanById(claz, id);
}
@SuppressWarnings("unchecked")
public <E extends BaseBean> E save(E bean) {
if (bean.getId() == 0) {
Serializable pKey = this.session().save(bean);
return (E) this.session().get(bean.getClass(), pKey);
} else {
this.session().saveOrUpdate(bean);
return bean;
}
}
public Session session() {
return this.sessionFactory.getCurrentSession();
}
}