首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Hibernate 惰性載入異常四大解決方案實戰

     編輯:Java 綜合教學

異常成因

Session 關閉後,嘗試訪問未初始化的關聯集合/物件(代理),拋出 LazyInitializationException。

方案一:Service 層預先初始化(手動觸發)

ElecUser user = list.get(0);
user.getElecRoles().size();  // 強制初始化集合
return user;

方案二:Hibernate.initialize() 工具方法

Hibernate.initialize(user.getElecRoles());

語義更清晰,同樣在 Session 開啟期間調用。

方案三:映射檔關閉惰性(lazy="false")

<set name="elecRoles" table="elec_user_role" lazy="false">
    <key><column name="userID"/></key>
    <many-to-many class="ElecRole" column="roleID"/>
</set>
缺點:關聯過多時會過度抓取,效能下降,不建議大量使用。

方案四:OpenSessionInViewFilter(Spring 提供)

web.xml 配置(務必置於 Struts2 Filter 之前):

<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>*.do</url-pattern>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

原理

  1. 事務仍在 Service 層提交/回滾。
  2. Session 延遲至視圖渲染完成後關閉,頁面可自由導航關聯。

風險

大頁面/高併發下 Session 持有時間過長,連接池耗盡導致「假死」,大數據量頁面慎用。

選型建議

場景推薦方案
少量關聯、明確使用點方案一/二(顯式初始化)
固定高頻關聯、可接受聯查方案三(lazy=false)
傳統 MVC、頁面導航複雜方案四(OSIV)+ 監控連接池
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved