Hibernate中session管理
儘管讓程式自主管理 Session 物件的生命週期也是可行的, 但是在實際 Java 應用中, 把管理 Session 物件的生命週期交給 Hibernate 管理, 可以簡化 Java 應用程式程式碼和軟體架構。
Hibernate 3 自身提供了三種管理 Session 物件的方法:
-
Session 物件的生命週期與本地執行緒繫結
-
Session 物件的生命週期與 JTA 事務繫結
-
Hibernate 委託程式管理 Session 物件的生命週期
在 Hibernate 的核心配置檔案中,hibernate.current_session_context_class 屬性用於指定 Session 管理方式, 可選值包括:
-
thread: Session 物件的生命週期與本地執行緒繫結
-
jta*: Session 物件的生命週期與 JTA 事務繫結
-
managed: Hibernate 委託程式來管理 Session 物件的生命週期
推薦將session的生命週期與本地執行緒繫結:
如果把 Hibernate 配置檔案的 hibernate.current_session_context_class 屬性值設為 thread, Hibernate 就會按照與本地執行緒繫結的方式來管理 Session
Hibernate 按以下規則把 Session 與本地執行緒繫結:
-
當一個執行緒(threadA)第一次呼叫 SessionFactory 物件的 getCurrentSession() 方法時, 該方法會建立一個新的 Session(sessionA) 物件, 把該物件與 threadA 繫結, 並將 sessionA 返回
-
當 threadA 再次呼叫 SessionFactory 物件的 getCurrentSession() 方法時, 該方法將返回 sessionA 物件
-
當 threadA 提交 sessionA 物件關聯的事務時, Hibernate 會自動清理 sessionA 物件的快取, 然後提交事務, 關閉 sessionA 物件. 當 threadA 撤銷 sessionA 物件關聯的事務時, 也會自動關閉 sessionA 物件
-
若 threadA 再次呼叫 SessionFactory 物件的 getCurrentSession() 方法時, 該方法會又建立一個新的 Session(sessionB) 物件, 把該物件與 threadB繫結, 並將 sessionB 返回
<!--配置將session與當前執行緒進行繫結-->
<property name="hibernate.current_session_context_class">thread</property>
Demo:
public class GetSessionByThread {
public static void main(String[] args) {
Configuration configure = new Configuration().configure();
//獲取session工廠
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session1 = sessionFactory.getCurrentSession();
Session session2 = sessionFactory.getCurrentSession();
System.out.println(session1==session2);
}
}
執行結果:
證明拿到了同一個session,如果將session與當前執行緒進行繫結,那麼session不需要手動關閉(session就不用close()!),當執行緒銷燬的時候,會自動關閉session