簡體   English   中英

沒有 CascadeType.REMOVE 的 CascadeType.ALL 更改持久化行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM