2

我有两个具有一对一关系的实体,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 约束强制执行。

这是一个直截了当的案例。两个相关实体,这种关系一方面是可选的,另一方面是强制性的。

哦,这是休眠 4.2.3-Final

4

1 回答 1

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;
}
}
于 2016-08-11T12:37:53.370 回答