HibernateUtil.java
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import com.iesb.exception.NoSuchHibernateSessionException;
import com.iesb.exception.NoSuchHibernateSessionTransactionException;
/**
* Hibernate常用工具类
*
* 维护了一个SessionFactory
* 封装了常用的获取 会话、获取事务、事务和提交等行为
*
* @author ypqiao
*
*/
public class HibernateUtil {
private final static SessionFactory sf ;
/**
* 初始化SessionFactory ,并引用它
*/
static {
sf = new Configuration().configure().buildSessionFactory();
}
/** 获取当前线程的Session**/
public static Session getSession(){
Session session = ThreadUtil.getSessionThreadLocal().get();
if( session == null ){
session = sf.openSession();
ThreadUtil.getSessionThreadLocal().set(session);
}
return session;
}
/** 关闭当前线程的Session**/
public static void closeSesion(){
Session session = ThreadUtil.getSessionThreadLocal().get();
if( session == null)
throw new NoSuchHibernateSessionException(" no such hibernate session ");
session.close();
ThreadUtil.getSessionThreadLocal().remove();
}
/** 获取当前线程的事务**/
public static Transaction beginTransaction(){
Transaction trancaction = ThreadUtil.getTransactionThreadLocal().get();
if( trancaction == null ){
trancaction = getSession().beginTransaction();
}
ThreadUtil.getTransactionThreadLocal().set(trancaction);
return trancaction;
}
/** 提交当前线程的事务**/
public static void commitTransaction(){
Transaction trancaction = ThreadUtil.getTransactionThreadLocal().get();
if( trancaction == null ){
throw new NoSuchHibernateSessionTransactionException(" no such transaction ");
}
trancaction.commit();
ThreadUtil.getTransactionThreadLocal().remove();
}
/** 回滚当前线程的事务**/
public static void rollbackTransaction(){
Transaction trancaction = ThreadUtil.getTransactionThreadLocal().get();
if( trancaction == null ){
throw new NoSuchHibernateSessionTransactionException(" no such transaction ");
}
trancaction.rollback();
ThreadUtil.getTransactionThreadLocal().remove();
}
}
ThreadUtil.java
import org.hibernate.Session;
import org.hibernate.Transaction;
/**
* 线程工具类
* @author ypqiao
*
*/
public class ThreadUtil {
// 维护当前线程和Session的关系
private static final ThreadLocal<Session> sessionLocal = new ThreadLocal<Session>();
// 维护当前线程和Transaction的关系
private static final ThreadLocal<Transaction> transactionLocal = new ThreadLocal<Transaction>();
public static ThreadLocal<Session> getSessionThreadLocal(){
return sessionLocal;
}
public static ThreadLocal<Transaction> getTransactionThreadLocal(){
return transactionLocal;
}
}