我有两个具有一对一关系的实体,A 和 B。B 实体是可选的,可以自行更新和删除,但必须始终链接到 A 的实例。
所以我有两个具有双向关系的 JPA 实体 A 和 B。这是从 A 到 B 的。
@OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
我可以创建 A 和 B,删除 A,然后两者都被删除。好。
但是由于从 A 到 B 的级联,如果我 em.remove(b)
删除不会持久化。即使我先执行 a.setB(null)
。
在保持级联的同时删除可选实体的唯一方法似乎是使用新的 JPA2 功能,orphanRemoval=true。调用a.setB(null)
,然后持久化A。
这意味着我不能直接对 B 进行操作,这意味着组合关系太强,所有对 B 的操作都必须通过 A 完成。
但是 B 不是嵌入对象,它本身就是一个完整的实体,我如何独立于 A 删除它?
最好的方法似乎是删除级联,并强制用户确保在删除 A?由 B 表中的 FK 约束强制执行。
这是一个非常简单的案例。两个相关的实体,这种关系在一端是可选的,而在另一端是强制性的。
哦,这是hibernate 4.2.3-Final
最佳答案
您当前的对象设计隐式定义了一个比另一个更重要。也就是说,一个人将拥有另一个人的外键。
要使它们相等,您只需在它们之间定义 JoinTable。两边设置cascade,一切正常。
例子:
文档类
@Entity
public class Document extends ABaseEntity {
private Medicine medicine;
@OneToOne(cascade = CascadeType.REMOVE)
@JoinTable(
name = "Document_Medicine",
joinColumns =
@JoinColumn(name = "DOC_ID", referencedColumnName = "ID"),
inverseJoinColumns =
@JoinColumn(name = "MED_ID", referencedColumnName = "ID"))
public Medicine getMedicine() {
return medicine;
}
public void setMedicine(Medicine medicine) {
this.medicine = medicine;
}
}
医学课
@Entity
public class Medicine extends ABaseEntity{
private Document document;
@OneToOne(mappedBy = "medicine", cascade = CascadeType.REMOVE)
public Document getDocument() {
return document;
}
public void setDocument(Document document) {
this.document = document;
}
}
关于java - JPA如何使用级联删除删除作为onetoone目标的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17847632/