實體 A 關聯實體 B(many-to-one),需求:刪除 A 時自動刪除關聯的 B。
<many-to-one name="b" class="B" column="B_ID" cascade="?"/>
| 值 | 觸發操作 | 包含動作 |
|---|---|---|
none | 默認 | 無級聯 |
save-update | save/update/saveOrUpdate | 持久化、合併 |
delete | delete | **刪除關聯對象** |
lock | lock | 重新附加 |
refresh | refresh | 從數據庫刷新 |
evict | evict | 從 Session 移除 |
replicate | replicate | 跨數據庫複製 |
all | 以上所有 | save-update, delete, lock, refresh, evict, replicate |
delete-orphan | 集合元素移除 | **僅用於 one-to-many 集合**,孤兒刪除 |
<many-to-one name="b" class="B" column="B_ID" cascade="delete"/>
<!-- 或 cascade="all" 包含 delete -->
效果:session.delete(a) 時,Hibernate 會先刪除關聯的 B,再刪除 A(前提是 B 無其他引用)。
FOREIGN KEY (B_ID) REFERENCES B(id) ON DELETE RESTRICT,數據庫會阻止刪除 B。ON DELETE CASCADE 或由 Hibernate 先刪 B 再刪 A(需確保事務順序正確)。many-to-one 意味著多個 A 可指向同一 B。one-to-one 或邏輯控制),或不配置 delete 級聯,改由服務層手動檢查引用計數後刪除。若 B 端有 <set name="aList" inverse="true">,刪除 A 時集合不會自動同步,需手動 b.getAList().remove(a) 或依賴數據庫外鍵級聯。
@ManyToOne(cascade = {CascadeType.REMOVE}) // 或 CascadeType.ALL
@JoinColumn(name = "B_ID")
private B b;
cascade="delete" 或 "all" 可實現刪除 A 時級聯刪 B。