感谢好朋友小智的帮助
/*
* 文件名: HibernateConnectionProvider.java
*
* 创建日期: 2007-4-2
*
* Copyright(C) 2007, by xiaozhi.
*
* 原始作者: <a href="mailto:xiaozhi19820323@hotmail.com">xiaozhi</a>
*
*/
package com.ultrapower.impl;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.impl.SessionFactoryImpl;
import com.ultrapower.IEntityDAO;
import com.ultrapower.utils.ConnectionProvider;
import com.ultrapower.utils.support.Page;
import com.ultrapower.utils.support.SearchCondition;
/**
* 负责为单个Entity 提供CRUD操作的Hibernate DAO基类和与QUARTZ的结合。
*
* @author <a href="mailto:xiaozhi19820323@hotmail.com">xiaozhi</a>
*
* @version $Revision$
*
* @since 2007-4-2
*/
public class HibernateConnectionProvider implements ConnectionProvider,IEntityDAO
{
/**数据库连接*/
private Connection conn = null ;
/**SessionFactory接口的实现类的对象*/
private static SessionFactoryImpl sessionFactory = null;
/**日志对象*/
private static final Log logger = LogFactory.getLog(HibernateConnectionProvider.class);
/**定义Session局部线程*/
private ThreadLocal localSession = new ThreadLocal();
/**定义事物局部线程*/
private ThreadLocal localTransaction = new ThreadLocal();
/**定义SessionFactory*/
protected static SessionFactory factory = null;
/**
* 初始化SessionFactory
*
*/
private static synchronized void init()
{
if (factory != null)
{
return;
}
try
{
factory = new Configuration().configure().buildSessionFactory();
sessionFactory = (SessionFactoryImpl)factory ;
}
catch (HibernateException he)
{
logger.info("SessionFactory init lost " + he);
he.printStackTrace() ;
}
}
/**
* 从局部线程里得到Session
*
* @return
*/
public Session getSession()
{
Session session = (Session)localSession.get() ;
if(session == null)
{
session = this.openSession() ;
}
else if(!session.isOpen())
{
throw new RuntimeException("Session is close");
}
return session ;
}
/**
* 通过SessionFactory创建Session
*
* @return
*/
private Session openSession()
{
if(factory == null)
{
this.init() ;
}
if(factory == null)
{
throw new RuntimeException("SessionFactory nullity");
}
Session session = null ;
try
{
session = factory.openSession();
localSession.set(session);
}
catch (HibernateException he)
{
if (logger.isInfoEnabled())
{
logger.info("session init lost");
}
he.printStackTrace() ;
}
return session ;
}
/**
* 检查Session是否为空
*
*/
protected void validateSession()
{
if(this.getSession() == null)
{
throw new RuntimeException("there is no session");
}
}
/**
* 检查对象是否为空
*
* @param obj 对象
*/
protected void validateObject(Object obj)
{
if(obj == null)
{
throw new RuntimeException("Object is not null");
}
}
/**
* 开启事物
*
*/
private void beginTransaction()
{
Session session = this.getSession() ;
this.validateSession() ;
try
{
Transaction tx = session.beginTransaction() ;
localTransaction.set(tx);
logger.info("Tranaaction is begin") ;
}
catch(HibernateException he)
{
logger.info("Tranaaction is not begin") ;
throw new RuntimeException("Tranaaction is not begin");
}
}
/**
* 提交事物或者回滚
*
* @param commit 是否提交
*/
private void endTransaction(boolean commit)
{
Transaction tx = (Transaction)this.localTransaction.get() ;
if(tx == null)
{
throw new RuntimeException("Transaction is not begin") ;
}
if(commit)
{
tx.commit() ;
}
else
{
tx.rollback() ;
}
}
/**
* 得到实体的Criteria
*
* @param clazz
* 类对象
* @return Criteria对象
*/
protected Criteria getEntityCriteria(Class clazz)
{
return this.getSession().createCriteria(clazz) ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.utils.ConnectionProvider#getConnection()
*/
public Connection getConnection() throws SQLException
{
if(sessionFactory == null)
{
this.init() ;
}
conn = sessionFactory.getConnectionProvider().getConnection() ;
return conn;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.utils.ConnectionProvider#shutdown()
*/
public void shutdown() throws SQLException
{
if(sessionFactory != null)
{
sessionFactory.close() ;
}
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#begin()
*/
public void begin()
{
this.beginTransaction() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#commit()
*/
public void commit()
{
this.endTransaction(true) ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#findBy(org.quartz.utils.support.SearchCondition, java.lang.Class)
*/
public List findBy(SearchCondition searchCond, Class clazz)
{
Criteria criteria = this.getEntityCriteria(clazz) ;
criteria.add(Restrictions.eq(searchCond.getField(), searchCond.getFieldValue())) ;
criteria.addOrder(Order.desc(this.getIdName(clazz))) ;
return criteria.list() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#findBy(org.quartz.utils.support.SearchCondition, org.quartz.utils.support.Page, java.lang.Class)
*/
public List findBy(SearchCondition searchCond, Page page, Class clazz)
{
Criteria criteria = this.getEntityCriteria(clazz) ;
criteria.add(Restrictions.eq(searchCond.getField(), searchCond.getFieldValue())) ;
if(page.getOrderBy() != null)
{
if(page.getOrder().equals("asc"))
{
criteria.addOrder(Order.asc(page.getOrderBy())) ;
}
else
{
criteria.addOrder(Order.desc(page.getOrderBy())) ;
}
}
else
{
criteria.addOrder(Order.desc(this.getIdName(clazz))) ;
}
criteria.setFirstResult(page.getFirstItemPos()) ;
criteria.setMaxResults(page.getPageSize()) ;
return criteria.list() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#findBy(org.quartz.utils.support.SearchCondition, int, java.lang.Class)
*/
public Page findBy(SearchCondition searchCond, int pageSize, Class clazz)
{
StringBuffer hqlStr = new StringBuffer() ;
hqlStr.append("select count(*) from "+clazz.getName()) ;
hqlStr.append(" obj where obj."+searchCond.getField()) ;
hqlStr.append("=:fieldValue") ;
Query query = this.getSession().createQuery(hqlStr.toString()) ;
query.setParameter("fieldValue", searchCond.getFieldValue()) ;
List list = query.list() ;
long totalCount = ((Long)list.get(0)).longValue();
hqlStr.delete(0, hqlStr.length()) ;
hqlStr = null ;
if(totalCount < 1)
{
totalCount = 0 ;
}
return new Page(totalCount,pageSize);
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#findByNotLike(org.quartz.utils.support.SearchCondition, java.lang.Class)
*/
public List findByNotLike(SearchCondition searchCond, Class clazz)
{
return this.getEntityCriteria(clazz).add(Restrictions.ne(searchCond.getField(), searchCond.getFieldValue())).list();
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#flush()
*/
public void flush()
{
this.getSession().flush() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#get(java.lang.Class, java.io.Serializable)
*/
public Object get(Class clazz, Serializable id)
{
return this.getSession().load(clazz, id);
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#getAll()
*/
public List getAll(Class clazz)
{
return this.getSession().createCriteria(clazz).addOrder(Order.desc(this.getIdName(clazz))).list() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#getAll(org.quartz.utils.support.Page, java.lang.Class)
*/
public List getAll(Page page, Class clazz)
{
Criteria criteria = this.getEntityCriteria(clazz) ;
if(page.getOrderBy() != null)
{
if(page.getOrder().equals("asc"))
{
criteria.addOrder(Order.asc(page.getOrderBy())) ;
}
else
{
criteria.addOrder(Order.desc(page.getOrderBy())) ;
}
}
else
{
criteria.addOrder(Order.desc(this.getIdName(clazz))) ;
}
criteria.setFirstResult(page.getFirstItemPos()) ;
criteria.setMaxResults(page.getPageSize()) ;
return criteria.list() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#getAll(int, java.lang.Class)
*/
public Page getAll(int pageSize, Class clazz)
{
String hqlStr = "select count(*) from "+clazz.getName() ;
Query query = this.getSession().createQuery(hqlStr) ;
List list = query.list() ;
long totalCount = ((Long)list.get(0)).longValue() ;
if(totalCount < 1)
{
totalCount = 0 ;
}
return new Page(totalCount,pageSize);
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#refresh(java.lang.Object, org.hibernate.LockMode)
*/
public void refresh(Object object, LockMode mode)
{
this.getSession().refresh(object, mode) ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#release()
*/
public void release()
{
if(this.localSession.get() != null)
{
Session session = (Session)this.localSession.get() ;
try
{
if(session.isOpen())
{
session.close() ;
System.out.println("--------------------------------------------------------") ;
System.out.println("session is close!!") ;
}
}
catch(HibernateException e)
{
session.close() ;
e.printStackTrace() ;
}
finally
{
this.localSession.set(null) ;
this.localTransaction.set(null) ;
}
}
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#remove(java.lang.Object)
*/
public void remove(Object o)
{
try
{
//this.begin() ;
this.getSession().delete(o) ;
//this.commit() ;
}
catch(HibernateException e)
{
//this.rollback() ;
logger.info("remove object is lost") ;
e.printStackTrace() ;
}
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#removeById(java.io.Serializable, java.lang.Class)
*/
public void removeById(Serializable id, Class clazz)
{
try
{
//this.begin() ;
this.getSession().delete(this.get(clazz, id)) ;
//this.commit() ;
}
catch(HibernateException e)
{
//this.rollback() ;
logger.info("by id remove is lost") ;
e.printStackTrace() ;
}
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#rollback()
*/
public void rollback()
{
this.endTransaction(false) ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#saveOrUpdate(java.lang.Object)
*/
public void saveOrUpdate(Object o)
{
try
{
//this.begin() ;
this.getSession().saveOrUpdate(o) ;
//this.commit() ;
}
catch(HibernateException e)
{
//this.rollback() ;
logger.info("save object is lost") ;
e.printStackTrace() ;
}
}
/**
* 增加一条记录
* @param o
* @return void
*/
public void save(Object o)
{
try
{
//this.begin() ;
this.getSession().save(o) ;
//this.commit() ;
}
catch(HibernateException e)
{
//this.rollback() ;
logger.info("save object is lost") ;
e.printStackTrace() ;
}
}
/**
* 更新一条记录
* @param o
* @return void
*/
public void update(Object o)
{
try
{
//this.begin() ;
this.getSession().update(o) ;
//this.commit() ;
}
catch(HibernateException e)
{
//this.rollback() ;
logger.info("update object is lost") ;
e.printStackTrace() ;
}
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#createCriteria(org.hibernate.criterion.Criterion[], java.lang.Class)
*/
public Criteria createCriteria(Criterion[] criterion,Class clazz)
{
Criteria criteria = this.getEntityCriteria(clazz) ;
for(int i = 0 ; i < criterion.length ; i++)
{
criteria.add(criterion[i]) ;
}
return criteria ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#getIdName(java.lang.Class)
*/
public String getIdName(Class clazz)
{
if(factory == null)
{
this.init() ;
}
String idName = factory.getClassMetadata(clazz).getIdentifierPropertyName() ;
return idName ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#finByLike(org.quartz.utils.support.SearchCondition, java.lang.Class)
*/
public List finByLike(SearchCondition searchCond, Class clazz)
{
Criteria criteria = this.getEntityCriteria(clazz) ;
criteria.add(Restrictions.like(searchCond.getField(), "%"+searchCond.getFieldValue()+"%",MatchMode.ANYWHERE)) ;
return criteria.list() ;
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#finByLike(org.quartz.utils.support.SearchCondition, org.quartz.utils.support.Page, java.lang.Class)
*/
public List finByLike(SearchCondition searchCond, Page page, Class clazz)
{
Criteria criteria = this.getEntityCriteria(clazz) ;
criteria.add(Restrictions.like(searchCond.getField(), "%"+searchCond.getFieldValue()+"%",MatchMode.ANYWHERE)) ;
if(page.getOrderBy() != null)
{
if(page.getOrder().equals("asc"))
{
criteria.addOrder(Order.asc(page.getOrderBy())) ;
}
else
{
criteria.addOrder(Order.desc(page.getOrderBy())) ;
}
}
else
{
criteria.addOrder(Order.desc(this.getIdName(clazz))) ;
}
criteria.setFirstResult(page.getFirstItemPos()) ;
criteria.setMaxResults(page.getPageSize()) ;
return criteria.list();
}
/*
*
* (non-Javadoc)
*
* @see org.quartz.IEntityDAO#finByLike(org.quartz.utils.support.SearchCondition, int, java.lang.Class)
*/
public Page finByLike(SearchCondition searchCond, int pageSize, Class clazz)
{
StringBuffer hqlStr = new StringBuffer() ;
hqlStr.append("select count(*) from "+clazz.getName()) ;
hqlStr.append(" obj where obj.") ;
hqlStr.append(searchCond.getField()) ;
hqlStr.append(" like:fieldValue") ;
Query query = this.getSession().createQuery(hqlStr.toString()) ;
query.setParameter("fieldValue", searchCond.getFieldValue()) ;
List list = query.list() ;
long totalCount = ((Long)list.get(0)).longValue() ;
if(totalCount < 1)
{
totalCount = 0 ;
}
hqlStr.delete(0, hqlStr.length()) ;
hqlStr = null ;
return new Page(totalCount,pageSize);
}
}