Hibernate工具類_抽取重複核心代碼

問題:在Hibernate中每次執行一次操做老是須要加載核心配置文件,獲取鏈接池等等都是重複動做,因此抽取出來session

解決:工具

package com.xxx.utils;
/**
*Hibernate的工具類
*@author cxh
*/

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HiberUtils {
//    1.建立一個session回話工廠,以單例模式管理(簡單的獲取session第一種)
    private static SessionFactory sessionFactory;
    
//    2.ThreadLocal存儲session,一開始直接將session綁到當前線程,後面直接來獲取線程中的session(第二種)
    private static ThreadLocal<Session> currentSession = new ThreadLocal<Session>(); 
    
    //初始化獲取session會話工廠
    static {
        try {
            sessionFactory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
        } catch (HibernateException e){
            e.printStackTrace();
            throw new HibernateException("初始化會話工廠失敗");
        }
    }
    
//    獲取單例會話工廠
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    
//    獲取session對象
    public static Session openSession() {
        return sessionFactory.openSession();
    }
    
//    獲取綁定到線程裏面的session,若是獲取不到就建立一個新的線程去綁定session.這裏面要想session對象的生命週期與當前線程綁定,還須要在hibernate配置文件裏面配置current_session_context_class屬性,設置爲thread
    public Session getCurrentThreadSession() {
//        獲取線程中的session
        Session s = currentSession.get();
        if(s == null) {
//            建立一個新的session
            s = sessionFactory.openSession();
//            將新的session與當前線程綁定
            currentSession.set(s);
        }
//        不爲空,當前線程有session,直接返回
        return s;
    }
    
//    關閉當前線程的session
    public static void closeCurrentThreadSession() {
//        獲取當前線程綁定的session對象
        Session s = currentSession.get();
//        當前線程有session對象,且該對象不爲空,須要關閉
        if(s != null) {
            s.close();
        }
        currentSession.set(null);
    }
    
//    3.hibernate中底層已經幫你封裝了將session與當前線程綁定的方法
    public static Session getCurrentSession() {
        return sessionFactory.getCurrentSession();
    }
    
    //上面兩種獲取線程裏面的session均可以直接調用該封裝方法進行關閉
    public static void closeSession() throws HibernateException {
        sessionFactory.getCurrentSession().close();
    }
    
}
相關文章
相關標籤/搜索