Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除并保存子项:JPA_Java_Jpa - Fatal编程技术网

Java 删除并保存子项:JPA

Java 删除并保存子项:JPA,java,jpa,Java,Jpa,以下是我的实体: @Entity public class Parent { @Id @Column(name = "ID") private Long id; @OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent") private Set<Child> childs = new HashSet<Child>(); ... } The child: @Enti

以下是我的实体:

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

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

 ...
}
The child:

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

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

  ...
}

如何修复此问题?

修改父级中的关系,如下所示:

    @OneToMany(cascade = {CascadeType.ALL}, orphanRemoval=true, mappedBy = "parent")
只需将新的子对象设置为父对象并合并父对象。现在,前面引用的子项变成孤立项,JPA在提交事务时自动删除这些子项

谢谢,
JK

旧的子对象可能仍然引用父对象,而新的子对象则不引用。两者都是一个问题

除了删除旧的子实例外,还应将子实例的父实例的引用设置为空

除了将新的子项添加到父项之外,还需要将父项添加到子项以提供外键

不要从多面(子面)级联到单面(父面)。此类级联的行为尚未定义,可能会以意外的方式工作

编辑:JPA2.0规范必须说明的内容:

请注意,应用程序负责维护 运行时关系的一致性,例如 确保一个系统的“一”面和“多”面是双向的 当应用程序 在运行时更新关系


您的意思是,不需要对child显式地调用delete()。我也遇到了同样的异常。constraintViolation.no需要调用delete(),而是在deleted child->set the new child to parent->merge the parents中将父项设置为null。它不起作用。相同的约束冲突问题。是否尝试使用CascadedType.MERGE而不是CascadeType.ALL。在我早期的项目中,我遇到了类似的问题。我删除了所有并添加了特定的级联类型。然后一切顺利。还有一件事,@kostja告诉我们,删除子实体中的casacadetype,这可能会导致意外行为。我更新父实体。子实体应该保存在DB中(DB中的新条目)。是的,这就是为什么在父端有级联的原因。我指的是子端的级联。因此,在child->set new child to parent->merge parentyes中调用delete()->将parent ref设置为null,并添加一个选项:set new child to parent->set parent on new child->merge parentset parent on new child::save parent应自动执行此操作。没有??我不能早点参加聊天。以下是我发布的内容:删除子项的顺序可能如下:*从父项列表中删除子项*从子项中删除父项引用(您可以切换前两个步骤)*直接从DB中删除子项,或者利用OrphanRemove=true*然后,附加新子项,将父引用添加到新子项*将新子项添加到父项*合并父项中的子项列表
    @OneToMany(cascade = {CascadeType.ALL}, orphanRemoval=true, mappedBy = "parent")