Hibernate延遲加載問題


  Hibernate延遲加載是項目中非常常用的技術。通過使用Hibernate延遲加載機制可以在加載數據是不必加載全部數據,而是只加載我們需要的那部分,其余部分在需要使用時才從數據庫裝載,以此來減少數據量提高系統性能。

  Hibernate延遲加載大致可以分為兩類,一類是延遲屬性加載,另一類是延遲關聯實體加載。

屬性加載

  屬性加載又可以分為兩類,一類是集合屬性,一類是非集合屬性。

關聯加載

  關聯加載也分兩種情況,一種是多對一,另一種是一對一。

  今天遇到的問題屬於關聯加載的,A、B部門屬於關聯部門,B屬於A的子部門,當查詢B部門的時候並沒有用的A部門的相關屬性,所以為了保證性能我們並沒有將A部門的信息加載到頁面。但是當我們在B部門頁面點擊”返回上一級“按鈕是,需要傳入一個A部門的ID,這時候B部門信息已經顯示到頁面,相關的session已經關閉了,系統會拋出異常,錯誤信息如下:

  

解決辦法:

(1)將延遲加載屬性設置為false

  

  這種方法最簡單,但是這樣我們就不能用hibernate的延遲加載機制了,也就是說每次加載都有可能加載很多用不到的數據,影響系統性能,這是不推薦的。

(2)在web.xml中配置openSessionInViewFilter這個過濾器,必須將openSessionInViewFilter過濾器配置中Struts2核心過濾器之前。

<!-- 配置Spring的用於解決懶加載問題的過濾器 -->      <filter>  
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>OpenSessionInViewFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
  
  過濾所有的*.action。這種方法,讓session關閉延遲在界面層才關閉。這樣在界面取數據的時候就不會報錯啦。

关注微信公众号

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com