[英]CascadeType.ALL without CascadeType.REMOVE changes persist behavior
在這個項目中,我有兩個實體 A 和 B,每個實體都與實體 C 有一對一的關系。 A 和 B 引用了一些 C。
@Entity
public class A {
@NotNull
@OneToOne(cascade = { CascadeType.ALL })
@JoinColumn(name = "fk_c", foreignKey = @ForeignKey(name = "fk_a_2_c"))
private C c;
}
@Entity
public class B {
@NotNull
@OneToOne(cascade = { CascadeType.ALL })
@JoinColumn(name = "fk_c", foreignKey = @ForeignKey(name = "fk_b_2_c"))
private C c;
}
@Entity
public class C {
@Nullable
@OneToOne(mappedBy = "c", fetch = FetchType.LAZY)
private A a;
@Nullable
@OneToOne(mappedBy = "c", fetch = FetchType.LAZY)
private B b;
}
到目前為止,在實體 B 中的字段 c 上使用 CascadeType.ALL 一切正常。我們現在想要刪除實體 B,但不刪除實體 C。因此,我們將實體 B 中的級聯更改為
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
現在,刪除行為是所期望的,但是當持久化實體 B 時,實體 C 沒有持久化級聯,而是我們得到一個 org.springframework.dao.InvalidDataAccessApiUsageException
Not-null property references a transient value - transient instance must be saved before current operation : xxx.B.c -> xxx.C
我已經嘗試放置所有級聯類型(PERSIST、MERGE、REMOVE、REFRESH、DETACH),根據 javax.persistence 文檔,這些類型應該產生與 CascadeType.ALL 相同的結果。 上述錯誤仍然發生。
那么:如何在不刪除級聯的情況下保持 CascadeType.ALL 的級聯行為?
在較舊的問題/答案Hibernate: CasecadeType.ALL vs {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE}我了解到 javax.persistence 的 CascadeType 枚舉在使用休眠時無法正常工作保存/保存或更新。
在我的情況下,使用 session.persist 而不是 session.saveOrUpdate 是不可取的,因此我需要將實體上的級聯從
@OneToOne(cascade = CascadeType.ALL)
到
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
@OneToOne
現在保存和刪除都可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.