這個從字面上就可以看出:不能初始化,沒有session。也就說主要原因是因為session關閉了。
在Hibernate中,<many-to-one.../>中的lazy默認為proxy。這樣hibernate在數據庫中查詢數據時事不會把關聯的
對象查出來的,而是保存一個獲得該值得方法:getXxxx()。當我們需要使用這個值的時候,也就是使用getXxx()方法來
調用的時候,Hibernate就會利用這個方法從數據庫中獲取相應的數據。但是很不幸,我們的session早就關閉了。這
是因為Hibernate的懶加載策略,在Hibernate中是使用sessionFactory來管理session,我們每進行一次數據庫操作時
都會新建一個session對象,當我們操作完成后,hibernate就會在dao層立即關閉該session。這樣做就可以嚴格控制
session,避免出現低級錯誤。
對於這種錯誤,一般都會有三個方法可以解決。
1、把lazy設成false。這個是最簡單的辦法,個人認為也是比較笨的方法。因為這是在用效率作為代價。
2、使用OpenSessionInViewFilter。這種方法是將session交給servlet filter來管理,每當一個請求來之后就會開
啟一個session,只有當響應結束后才會關閉。如下:
1 <filter-name>hibernateFilter</filter-name> 2 <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class> 3 </filter 4 <filter-mapping> 5 <filter-name>hibernateFilter</filter-name> 6 <url-pattern>/*</url-pattern> 7 </filter-mapping>
上面的配置文件時在web.xml中配置的。
3、將hibernate的抓起策略改為join。也就是是left join fetch或inner join fetch語法。就是在<many-to-one../>中配
置lazy="false" fetch="join"即可。如:
1 <many-to-one name="worker" lazy="false" fetch="join" class="com.paixie.domain.Worker"> 2 3 <column name="positionId"></column> 4 5 </many-to-one>