有關no Session問題的解決
在我們使用hibernate框架和struts2框架的時候,在使用查詢功能時,有時會出現no session問題。那麼為什麼會出現這個問題呢?
首先明確no session中的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和一次完整的請求過程對應的執行緒相繫結。
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2、關閉延遲載入
1.在xml檔案配置中可以將lazy屬性的值設為false;
2.在註解配置中可以將fetch屬性設為“fetch=FetchType.EAGER“
關閉延遲載入可能會一次查出許多暫時並不需要的資料,影響效率