JPA如何使用级联删除删除作为onetoone目标的实体

时间:2013-07-25 01:42:35

标签: java hibernate jpa

我有两个具有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

1 个答案:

答案 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;
}
}