[英]CascadeType.ALL without CascadeType.REMOVE changes persist behavior
In this project I have two Entities A and B that each have a OneToOne relationship to Entity C. There are some C that are referenced by A and B.在这个项目中,我有两个实体 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;
}
Until now everything was working fine using CascadeType.ALL on field c in Entity B. We now want to delete Entity B without ever deleting Entity C. Thus, we change the cascading in Entity B to到目前为止,在实体 B 中的字段 c 上使用 CascadeType.ALL 一切正常。我们现在想要删除实体 B,但不删除实体 C。因此,我们将实体 B 中的级联更改为
@OneToOne(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
Now, the delete behavior is as desired, but when persisting Entity B there is no persist cascading for Entity C, instead we get an org.springframework.dao.InvalidDataAccessApiUsageException现在,删除行为是所期望的,但是当持久化实体 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
I already tried placing all cascade types (PERSIST, MERGE, REMOVE, REFRESH, DETACH) which, according to the javax.persistence documentation should yield the same result as CascadeType.ALL.我已经尝试放置所有级联类型(PERSIST、MERGE、REMOVE、REFRESH、DETACH),根据 javax.persistence 文档,这些类型应该产生与 CascadeType.ALL 相同的结果。 The error stated above still occurs.
上述错误仍然发生。
So: How can I keep the cascading behavior of CascadeType.ALL without REMOVE-cascading?那么:如何在不删除级联的情况下保持 CascadeType.ALL 的级联行为?
In an older question/answer Hibernate: CasecadeType.ALL vs {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE} I learned that the CascadeType enum of javax.persistence does not work properly when using hibernates save/saveOrUpdate.在较旧的问题/答案Hibernate: CasecadeType.ALL vs {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH, CascadeType.REMOVE}我了解到 javax.persistence 的 CascadeType 枚举在使用休眠时无法正常工作保存/保存或更新。
Using session.persist instead of session.saveOrUpdate was not desirable in my case, so I needed to change the cascading on my entity from在我的情况下,使用 session.persist 而不是 session.saveOrUpdate 是不可取的,因此我需要将实体上的级联从
@OneToOne(cascade = CascadeType.ALL)
to到
@Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
@OneToOne
Now saving and deleting both work just fine.现在保存和删除都可以正常工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.