1. 程式人生 > >Hibernate中session管理

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