1. 程式人生 > >Hibernate延遲載入問題

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關閉延遲在介面層才關閉。這樣在介面取資料的時候就不會報錯啦。