我有两个具有onetoone关系的实体,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
答案 0 :(得分:1)
您当前的对象设计隐含地定义了一个比另一个更重要。也就是说,一个人将拥有另一个外键。
要使它们相等,您只需在它们之间定义JoinTable即可。在两侧设置级联,然后一切都将按预期工作。
示例:
文档课
@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;
}
}