HibernateUtil.java

import javax.naming.InitialContext;  
import javax.naming.NamingException;  
  
import org.apache.commons.logging.Log;  
import org.apache.commons.logging.LogFactory;  
import org.hibernate.Interceptor;  
import org.hibernate.Session;  
import org.hibernate.SessionFactory;  
import org.hibernate.Transaction;  
import org.hibernate.cfg.Configuration;  
import org.hibernate.cfg.Environment;  
import org.hibernate.transaction.CMTTransactionFactory;  
  
/** 
* Hibernate 工具类 用于初始化Hibernate,并进行Session和Transaction的管理 
*/  
public class HibernateUtil {  
  
private static Log log = LogFactory.getLog(HibernateUtil.class);  
  
private static final String INTERCEPTOR_CLASS = "hibernate.util.interceptor_class";  
  
private static Configuration configuration;  
  
private static SessionFactory sessionFactory;  
  
private static boolean useThreadLocal = true;  
  
// 保存Session对象实例的线程局部变量  
private static ThreadLocal threadSession = new ThreadLocal();  
  
// 保存Transaction对象实例的线程局部变量  
private static ThreadLocal threadTransaction = new ThreadLocal();  
  
static {  
   try {  
    // 创建Configuration对象  
    configuration = new Configuration();  
  
    // 读取hibernate.properties或者hibernate.cfg.xml文件  
    configuration.configure();  
  
    // 指定一个全局的用户子定义的拦截器  
    String interceptorName = configuration  
      .getProperty(INTERCEPTOR_CLASS);  
    if (interceptorName != null) {  
     Class interceptorClass = HibernateUtil.class.getClassLoader()  
       .loadClass(interceptorName);  
     Interceptor interceptor = (Interceptor) interceptorClass  
       .newInstance();  
     configuration.setInterceptor(interceptor);  
    }  
  
    // 如果使用CMT,那么就不使用线程安全的Session和Transaction  
    if (CMTTransactionFactory.class  
      .getName()  
      .equals(  
        configuration  
          .getProperty(Environment.TRANSACTION_STRATEGY))) {  
     useThreadLocal = false;  
    }  
  
    if (configuration.getProperty(Environment.SESSION_FACTORY_NAME) != null) {  
     // 绑定Hibernate到JNDI  
     configuration.buildSessionFactory();  
    } else {  
     // 使用静态的变量  
     sessionFactory = configuration.buildSessionFactory();  
    }  
   } catch (Throwable ex) {  
    // 必须捕获Throwable,否则不能捕获NoClassDefFoundError异常以及它的子类错误  
    log.error("Building SessionFactory failed!", ex);  
    throw new ExceptionInInitializerError(ex);  
   }  
}  
  
/** 
   * 返回全局的SessionFactory对象的实例 
   *  
   * @return SessionFactory 
   */  
public static SessionFactory getSessionFactory() {  
   SessionFactory sf = null;  
   String sfName = configuration  
     .getProperty(Environment.SESSION_FACTORY_NAME);  
   if (sfName != null) {  
    log.debug("Looking up SessionFactory in JNDI.");  
    try {  
     sf = (SessionFactory) new InitialContext().lookup(sfName);  
    } catch (NamingException e) {  
     throw new RuntimeException(e);  
    }  
   } else {  
    sf = sessionFactory;  
   }  
   if (sf == null) {  
    throw new IllegalStateException("SessionFactory not available.");  
   }  
   return sf;  
}  
  
/** 
   * 重新构建SessionFactory对象的实例 
   *  
   */  
public static void rebuildSessionFactory() {  
   log.debug("Using current Configuration for rebuild");  
   rebuildSessionFactory(configuration);  
}  
  
/** 
   * 使用指定的Configuration对象重新构建SessionFactory对象的实例 
   *  
   * @param cfg 
   */  
public static void rebuildSessionFactory(Configuration cfg) {  
   log.debug("Rebuilding the SessionFactory from given Configuration.");  
   synchronized (sessionFactory) {  
    if (sessionFactory != null && !sessionFactory.isClosed()) {  
     sessionFactory.close();  
    }  
    if (cfg.getProperty(Environment.SESSION_FACTORY_NAME) != null) {  
     cfg.buildSessionFactory();  
    } else {  
     sessionFactory = cfg.buildSessionFactory();  
    }  
    configuration = cfg;  
   }  
}  
  
/** 
   * 关闭当前SessionFactory并且释放所有资源 
   *  
   */  
public static void shutdown() {  
   log.debug("Shutting down Hibernate.");  
   // 关闭缓冲和连接池  
   getSessionFactory().close();  
  
   // 清除静态变量  
   configuration = null;  
   sessionFactory = null;  
  
   // 清除本地进程变量  
   threadSession.set(null);  
   threadTransaction.set(null);  
}  
  
/** 
   * 获得当前Session对象的实例 
   *  
   * @return Session 
   */  
public static Session getCurrentSession() {  
   if (useThreadLocal) {  
    Session s = (Session) threadSession.get();  
    if (s == null) {  
     log.debug("Opening new Session for this thread.");  
     s = getSessionFactory().openSession();  
     threadSession.set(s);  
    }  
    return s;  
   } else {  
    return getSessionFactory().getCurrentSession();  
   }  
}  
  
/** 
   * 重新连接当前的Session 
   *  
   * @param session 
   */  
public static void reconnect(Session session) {  
   if (useThreadLocal) {  
    log.debug("Reconnecting Session to this thrwad.");  
    session.reconnect();  
    threadSession.set(session);  
   } else {  
    log  
      .error("Using CMT/JTA,intercepted not supported reconnect call.");  
   }  
}  
  
/** 
   * 断开当前Session 
   *  
   * @return Session the disconnected Session 
   */  
public static Session disconnectedSession() {  
   if (useThreadLocal) {  
    Transaction tx = (Transaction) threadTransaction.get();  
    if (tx != null && (!tx.wasCommitted() || !tx.wasRolledBack())) {  
     throw new IllegalStateException(  
       "Disconnecting Session but Transaction still open.");  
    }  
    Session session = getCurrentSession();  
    threadSession.set(null);  
    if (session.isConnected() && session.isOpen()) {  
     log.debug("Disconnecting Session from this thread.");  
     session.disconnect();  
    }  
    return session;  
   } else {  
    log  
      .error("Using CMT/JTA,intercepted not supported disconnect call.");  
    return null;  
   }  
}  
  
/** 
   * 关闭Session对象 
   *  
   */  
public static void closeSession() {  
   if (useThreadLocal) {  
    Session s = (Session) threadSession.get();  
    threadSession.set(null);  
    Transaction tx = (Transaction) threadTransaction.get();  
    if (tx != null && (!tx.wasCommitted() || !tx.wasRolledBack())) {  
     throw new IllegalStateException(  
       "Closing Session but Transaction still open.");  
    }  
    if (s != null && s.isOpen()) {  
     log.debug("Closing Session of this thread.");  
     s.close();  
    }  
   } else {  
    log.warn("Using CMT/JTA,intercepted superfluous close call.");  
   }  
}  
  
/** 
   * 开始一个新的数据库事务 
   *  
   */  
public static void beginTransaction() {  
   if (useThreadLocal) {  
    Transaction tx = (Transaction) threadTransaction.get();  
    if (tx == null) {  
     log.debug("Starting new database transaction in this thread.");  
     tx= getCurrentSession().beginTransaction();  
     threadTransaction.set(tx);  
    }  
     
   } else {  
    log.warn("Using CMT/JTA,intercepted superfluous tx begin call.");  
   }  
}  
  
/** 
   * 提交数据库事务 
   *  
   */  
public static void commitTransaction() {  
   if (useThreadLocal) {  
    try {  
     Transaction tx = (Transaction) threadTransaction.get();  
     if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {  
      log  
        .debug("Committing database transaction of this thread.");  
      tx.commit();  
     }  
     threadTransaction.set(null);  
    } catch (RuntimeException e) {  
     log.error(e);  
     rollbackTransaction();  
     throw e;  
    }  
   } else {  
    log.warn("Using CMT/JTA,intercepted superfluous tx commit call.");  
   }  
}  
  
/** 
   * 回滚数据库事务 
   *  
   */  
public static void rollbackTransaction() {  
   if (useThreadLocal) {  
  
    Transaction tx = (Transaction) threadTransaction.get();  
    try {  
     threadTransaction.set(null);  
     if (tx != null && !tx.wasCommitted() && !tx.wasRolledBack()) {  
      log  
        .debug("Trying to rollback database transaction of this thread.");  
      tx.rollback();  
     }  
    } catch (RuntimeException e) {  
     throw new RuntimeException(  
       "Migth swallow original cause,check Error log!", e);  
    } finally {  
     closeSession();  
    }  
   } else {  
    log.warn("Using CMT/JTA,intercepted superfluous tx rollback call.");  
   }  
}  
}  
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值