1. 程式人生 > >no session 問題出現的原因及解決方案

no session 問題出現的原因及解決方案

lte base 請求 屬性 TP IE session關閉 範圍 關聯對象

session是hibernate框架與數據庫交互的對象,與HttpSession是完全不同的東西。session通常與線程綁定,使用完之後就會關閉。

no session問題的出現與延遲加載有關。延遲加載的含義是hibernate執行查詢操作時,並不會真正去數據庫中查找出數據,而是要等到使用時才去數據庫中查找數據。

Hibernate 允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限於同一個 Hibernate Session 範圍之內進行。如果 Service 層返回一個啟用了延遲加載功能的領域對象給 Web 層,當 Web 層訪問到那些需要延遲加載的數據時,由於加載領域對象的 Hibernate Session 已經關閉,這些導致延遲加載數據的訪問異常。

也就是說如果session第一次查找中有延遲加載,查找完之後關閉了session,這時再想使用延遲加載的數據,就得再次調用session查找,但此時session已經關閉,所以發生no session問題。

解決方法:1、在web.xml文件配置 OpenSessionInViewFilter過濾器,這種方法是延遲session關閉的時機,把一個Hibernate Session和一次完整的請求過程對應的線程相綁定。

  2、關閉延遲加載

  1.在xml文件配置中可以將lazy屬性的值設為false;

  2.在註解配置中可以將fetch屬性設為“fetch=FetchType.EAGER“

關閉延遲加載可能會一次查出許多暫時並不需要的數據,影響效率

no session 問題出現的原因及解決方案