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

Hibernate 級聯操作與延遲加載深度解析:cascade、inverse、lazy、fetch 策略

     編輯:Java 綜合教學

Hibernate 級聯操作與延遲加載深度解析:cascade、inverse、lazy、fetch 策略

本文系統梳理 Hibernate 關聯映射中的級聯操作、關係維護方向、延遲加載策略與抓取模式,並給出 XML 配置最佳實踐。

核心概念

屬性作用範圍說明
cascade<one-to-one>、<one-to-many>、<many-to-many>操作主對象時是否級聯到關聯對象:none、all、save-update、delete、delete-orphan、lock、refresh、evict、replicate、persist、merge
inverse<one-to-many>、<many-to-many> 集合端true 表示放棄維護關係(由關聯另一端維護),false(默認)表示雙向維護。one-to-many 必須在集合端設為 true,否則會發出額外 UPDATE 外鍵語句。
lazy<class>、<property>、<set> 等true(默認)啟用延遲加載,false 立即加載。類級別 lazy="true" 返回代理對象。
fetch<one-to-one>、<many-to-one>、<set>select(默認,單獨 SELECT)、join(外連接)、subselect(子查詢)、batch(批量預加載)。

級聯操作詳解

  • save-update:持久化/更新主對象時,級聯保存/更新臨時態或游離態關聯對象。
  • delete:刪除主對象時級聯刪除關聯對象。
  • delete-orphan:僅用於 one-to-many,當子對象從集合移除(斷開關係)時自動刪除。
  • all:包含上述所有操作。

建議:many-to-one/many-to-many 一般不設級聯,避免誤刪;one-to-one/one-to-many 視業務需要配置。

延遲加載與抓取策略組合


<set name="emps" cascade="save-update" lazy="true" fetch="select">
  <key column="depart_id"/>
  <one-to-many class="Employee"/>
</set>


<set name="students" table="teacher_student" inverse="true" lazy="true">
  <key column="teacher_id"/>
  <many-to-many class="Student" column="student_id"/>
</set>

常見坑與優化

  1. N+1 問題:遍歷集合觸發大量 SELECT → 使用 fetch="join" 或 HQL LEFT JOIN FETCH、@BatchSize 批量加載。
  2. LazyInitializationException:Session 關閉後訪問代理 → Open Session In View 模式、DTO 投影、或手動 Hibernate.initialize(proxy)。
  3. 雙向關係維護:雙向一對多,inverse="true" 必須加在集合端,且雙向設置關聯雙向同步(parent.getChildren().add(child); child.setParent(parent);)。

代碼練習片段

<!-- 一對多級聯保存 -->
<set name="emps" cascade="save-update">
  <key column="depart_id"/>
  <one-to-many class="Employee"/>
</set>

<!-- 多對多,Teacher 不維護中間表 -->
<set name="students" table="teacher_student" inverse="true">
  <key column="teacher_id"/>
  <many-to-many class="Student" column="student_id"/>
</set>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved