解決Hibernate:could not initialize proxy - no Session


            這個從字面上就可以看出:不能初始化,沒有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>

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM