本文系統梳理 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>
fetch="join" 或 HQL LEFT JOIN FETCH、@BatchSize 批量加載。Hibernate.initialize(proxy)。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>