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>