1. 程式人生 > >Hibernate懶載入問題解決

Hibernate懶載入問題解決

解決Hibernate:could not initialize proxy-no Session

出現的問題:不能初始化,沒有session(session關閉)

   在Hibernate中,<many-to-one ../>中的lazy預設為proxy,這樣hibernate在資料庫中查詢資料時不會把關聯的物件查出來,而是儲存一個獲取該值的方法:getXxx(),當我們需要使用這個值的時候,也就是使用getXxx()方法來呼叫的時候,Hibernate就會利用這個方法從資料庫中獲取相應的資料。但是session已經關閉,這是因為Hibernate懶載入的策略,在hibernate中使用sessionFactory來管理session,我們每進行一次資料庫操作時都會新建一個session物件,當我們操作完成後,hibernate就會在dao層立即關閉session,這樣就嚴格控制session,避免出現低階錯誤。

         對於這種錯誤,一般都會有三個方法可以解決

         1、把lazy設成false,這個是最簡單的方法

         2、使用OpenSessionInViewFilter。這個方法是將session交給servlet filter管理,每當一個請求來之後就會開啟一個session,只有當響應結束後才會關閉。如下:

               <filter-name>hibernateFilter</filter-name>

               <filter-class>

                 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter

               </filter-class>

               <filter-mapping>

                   <filter-name>hibernateFilter</filtername>

                   <url-pattern>/*</url-pattern>

                </filter-mapping>

               上面的配置檔案都是在web.xml中配置的

           3、將hibernate的抓緊策略改為join,也就是left join fetch 或inner join fetch語法, 就是在<many-to-one ../>中配置lazy="false" fetch="join" 即可。如:

            <many-to-one name="worker" lazy="false" fetch="join" class="com.paixie.dpmain.Worker">

              <column name="positionId"></column>

             </many-to-one>