Hibernate 透過 @OneToOne、@OneToMany 等關聯註解的 cascade 屬性,定義當對父實體執行特定 Session 操作時,是否自動傳播至關聯的子實體。以下為各級聯類型的觸發時機與行為對照。
| 級聯類型 | 觸發 Session 方法 | 行為描述 |
|---|---|---|
PERSIST |
session.persist(entity) |
儲存父實體時,級聯儲存關聯的新實體 (非 save()) |
MERGE |
session.merge(entity) |
合併父實體時,級聯合併關聯實體;若記憶體無對應物件則表現為級聯儲存 |
REMOVE |
session.delete(entity) / session.remove(entity) |
刪除父實體時,級聯刪除關聯實體。需注意:關聯雙方皆需具備 ID (通常先 get/load 取得) |
REFRESH |
session.refresh(entity) |
重新整理父實體時,級聯重新整理關聯實體,從資料庫重新載入狀態。常用於解決「Found two representations of same collection」異常 |
ALL |
上述所有操作 | 包含 PERSIST、MERGE、REMOVE、REFRESH 四種級聯行為 |
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL)
private Set children = new HashSet<>();
CascadeType.DETACH (JPA 2.0+):對應 session.evict(),將實體從持久化上下文移除。ALL 可能導致非預期的大量資料異動,建議依業務語義精確指定所需類型。