1. 程式人生 > >有關no Session問題的解決

有關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“

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