我对父实体和子实体之间的简单映射有问题.所有这些都很好,只是当我从集合中删除子记录时,它们不会被删除.

家长:

@Entity
public class Parent {
    @Id
    @Column(name = "ID")
    private Long id;

    @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
    private Set<Child> childs = new HashSet<Child>();

 ...
}

子元素:

@Entity
public class Child {
    @Id
    @Column(name = "ID")
    private Long id;

    @ManyToOne(cascade = CascadeType.ALL)
    @JoinColumn(name="PARENTID", nullable = false)
    private Parent parent;

  ...
}

如果我现在从Childs集合中删除AND CHILD,它不会从数据库中删除.我试图取消child.parent的参考,但也不起作用.

实体在web应用程序中使用,删除是Ajax请求的一部分.按下"保存"按钮时,我没有已删除子元素的列表,因此我无法隐式删除它们.

推荐答案

JPA的行为是正确的(意思是as per the specification):对象不会仅仅因为从OneToMany集合中删除而被删除.有一些特定于供应商的扩展可以做到这一点,但原生JPA不能满足这一点.

这在一定程度上是因为JPA实际上不知道是否应该删除从集合中删除的内容.在对象建模术语中,这就是composition和"聚合"之间的区别.

composition中,没有父实体,子实体就不存在.一个典型的例子是在房子和房间之间.删除房子,房间也会被删除.

Aggregation是一种比较松散的联系,以课程和学生为代表.删除该课程,学生仍然存在(可能在其他课程中).

因此,您需要使用特定于供应商的扩展来强制执行此行为(如果可用),或者显式删除子项并将其从父项集合中删除.

我知道:

Java相关问答推荐

java.lang. StackOverFlow错误:显示表及其依赖项时为空

在Spring Boot中测试时出现SQL语法错误

找到允许的最大底片

我无法将附件发送到NetBeans之外

S的字符串表示是双重精确的吗?

Java中如何根据Font.canDisplay方法对字符串进行分段

使用Testcontainers与OpenLiberty Server进行集成测试会抛出SocketException

内存中的H2修剪尾随空格

为什么S的文档中说常量方法句柄不能在类的常量池中表示?

使用UTC时区将startDatetime转换为本地时间

与不同顺序的组进行匹配,不重复组但分开

JavaFX:无论何时显示应用程序,如何更改组件/ node 位置?

如何在IntelliJ IDEA的Build.sbt中添加外部JAR文件?

在Spring Boot JPA for MySQL中为我的所有类创建Bean时出错?

接受类及其接口的Java类型(矛盾)

为什么使用lo索引来解决二进制搜索问题不同于使用hi索引?

整数->;双取消框,但双->;int不';t开箱.为什么?

如何在Selenium上继续使用最新的WebDriver版本

Java泛型方法重载

获取月份';s在java中非UTC时区的开始时间和结束时间