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

标签 java hibernate jpa

我有两个具有一对一关系的实体,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/

相关文章:

java - Microsoft SQL Server JDBC 驱动程序 -SSL 问题

java - 是否可以只为某个目标(Android 应用程序)编译一段代码?

java - 如何在hibernate中从hibernate.cfg.xml加载所有xml映射文件?

java - org.hibernate.QueryParameterException : could not locate named parameter [templateId]

java - Netty 工作线程和吞吐量

java - java 中的 protected 访问不起作用

java - JPQL表连接查询

java - 使用不是 Id 的 hibernate 和 Mysql 的自动增量,所以我可以用触发器重置它

java - hibernate : key '173-604' 的重复条目 'PRIMARY'

java - 为什么我的实体在 JPA 中持久化后仍然保持分离状态?