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."); }}}
相关资源:敏捷开发V1.0.pptx