天天看點

Hibernate懶加載異常

懶加載原理

在Hibernate中,查詢方法有兩個,分别是get()和load(),這兩種方法的不同就是load()擁有懶加載的特性。Load()方法就是在查詢某一條資料的時候并不會直接将這條資料以指定對象的形式來傳回,而是在你真正需要使用該對象裡面的一些屬性的時候才會去資料庫通路并得到資料。他的好處就是可以減少程式本身因為與資料庫頻繁的互動造成的處理速度緩慢。

下面是一個懶加載異常的圖檔

Hibernate懶加載異常

對于懶加載異常的解決辦法:

方法一、修改*.hbm.xml,令lazy=”false”

<!-- parent屬性,本類與Department(上級)的多對一關系 -->
        <many-to-one name="parent" class="Department" column="parentId" lazy="false"></many-to-one>

        <!-- children屬性,本類與Department(下級)的一對多關系
        cascade = "delete" 級聯删除子部門,即當删除某部門連同删除其所有子部門
         -->
        <set name="children" cascade="all-delete-orphan" lazy="false">
            <key column="parentId"></key>
            <one-to-many class="Department"/>
        </set>              
    </class>

</hibernate-mapping>
           

這種方法比較簡單,但是懶加載功能可能就喪失了

方法二、通過Spring的OpenSessionInViewFilter

在web.xml中添加如下代碼

<!-- 配置Spring的用于解決懶加載問題的過濾器 (必須寫在struts的前面)-->
  <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>

  <!-- 配置struts2的核心過濾器 -->
  <filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
           

**Hibernate 允許對關聯對象、屬性進行延遲加載,但是必須保證延遲加載的操作限于同一個 Hibernate Session 範圍之内進行。如果 Service 層傳回一個啟用了延遲加載功能的領域對象給 Web 層,當 Web 層通路到那些需要延遲加載的資料時,由于加載領域對象的 Hibernate Session 已經關閉,這些導緻延遲加載資料的通路異常.

OpenSessionInViewFilter的主要功能是用來把一個Hibernate Session和一次完整的請求過程對應的線程相綁定。目的是為了實作”Open Session in View”的模式。**