当前位置: 首页 > 知识库问答 >
问题:

JPA如何通过级联删除删除作为onetoone目标的实体

阎冠玉
2023-03-14

我有两个具有一对一关系的实体,A和B。B实体是可选的,可以自行更新和删除,但必须始终链接到A的实例。

所以我有两个JPA实体,A和B具有双向关系。这是从A到B的那个。

@OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL)

我可以创建a和B,删除a,然后两者都被删除。好的

但由于从A到B的级联,如果i<code>em。remove(b)删除不会持久化。即使我做了a。首先是setB(null)

在保留级联的同时删除可选实体的唯一方法似乎是使用新的JPA2特性orphanRemoval=true。调用< code>a.setB(null),然后保存a。

这意味着i不能直接对B进行操作,这意味着成分关系太强,B上的所有操作都必须通过A完成。

但是B不是一个嵌入的对象,它本身就是一个成熟的实体,我怎么能独立于A删除它呢?

最好的方法似乎是删除级联,并强制用户确保在删除 A 之前单独删除任何相关对象?由 B 表中的 FK 约束强制执行。

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

哦,这是hibernate 4.2.3的最终版本

共有1个答案

屠和洽
2023-03-14

您当前的对象设计隐含地定义了一个比另一个更重要。也就是说,一个人将拥有另一个人的外键。

要使它们相等,只需在它们之间定义 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;
}
}
 类似资料:
  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建

  • 编辑:修改问题以更好地反映问题。此处最初发布的问题 我有一个父实体(< code >上下文)和一个子实体(< code >用户)。父级上的级联“删除”不会删除子级。代码如下:

  • 问题内容: 在我的一项工作中,我有以下代码: 这始终无法删除具有以下错误的实体: DELETE语句与REFERENCE约束“ FK966F0D9A66DB1E54”冲突。数据库“ TFADB”的表“ dbo.MonthlyReport_categories”的列“ MonthlyReport_id”中发生了冲突。 我如何指定映射,以便在删除报告时删除category集合中的元素? 问题答案: 级联

  • 你好,我在删除实体时遇到了问题。entitymanager不会删除实体。有人看到代码中的错误吗? 错误消息: java.lang.Assertionerror: 预期 :null 实际 :帐户{id=1, 客户=客户 id=1, 名字=“金”, 姓氏=“佩德森”, email='kim@yahoo.no“, 电话号码=”90045870“, 出生=1980-11-05 00:00:00.0}, 登

  • 我无法使用Hibernate JPA嵌入使cascase删除在Java EE容器管理的应用程序中工作。我们将不胜感激。我有一个实体‘公司',与其他实体有四个任何关系。当测试应用程序(使用Arquillian框架)时,我无法使级联删除工作;公司实体被删除,删除后子实体仍然存在。我读到了这里:JPA和Hibernate Cascade DELETE OneToMany不起作用,这可能是一个测试问题,所

  • 在数据库中,将有一个列,并对的列具有外键约束。 对于在删除时级联的外键约束,可能执行的一些操作包括、和。这给出了以下方案组合。 a:在JPA中对父级进行级联删除调用,在删除父行时删除数据库中的子级。 b:在JPA中级联删除,在父删除时将子表中的外键列设置为null。在这种情况下,@joincolumn中的和中的可能需要为true/false。 C:在JPA中进行级联删除,在数据库中对外键删除不做任