在這個專案中,我有兩個物體 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 的級聯行為?
uj5u.com熱心網友回復:
在較舊的問題/答案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
現在保存和洗掉都可以正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/358247.html
