Hibernate PersistentSet remove()操作不起作用

Cha*_*hew 7 java hibernate jpa set spring-data-jpa

我在我的父实体中有一个Set,如下所示:

Class Parent {
 @OneToMany(mappedBy = parent, cascade = CasacadeType.ALL)
 Set<Child> children;
}

Class Child {
 @Column(nullable=false)
 @ManyToOne
 Parent parent;
}
Run Code Online (Sandbox Code Playgroud)

现在事件,如果我对其中一个元素的Set执行remove()操作,它实际上不会被删除.

Vla*_*cea 8

您的映射应如下所示:

public class Parent { 
    @OneToMany(mappedBy = parent, cascade = CasacadeType.ALL, orphanRemoval = true) 
    private Set<Child> children = new HashSet<>();

    public void removeChild(Child child) {
        children.remove(child);
        child.setParent(null);
    }
}

public class Child {
    @ManyToOne
    private Parent parent;
}
Run Code Online (Sandbox Code Playgroud)

正如上文这篇文章,因为你有一个双向关联,你必须有双方同步.

因此,最好打电话:

parent.removeChild(child);
Run Code Online (Sandbox Code Playgroud)

这样一来,removeChild是要去除Childchildren集,并设置SetChild关联parent.

  • 如果使用hbmddl,则nullable = false将应用于自动生成的架构.如果使用生成的模式,则可能无法将child.parent设置为null. (2认同)

Mus*_*mal 5

我遇到了同样的问题,虽然使用 remove 和 setParent 为 null,但相关数据仍然在 db 中。调试后,我看到无法从父级的子级列表中删除相关的子级对象。当我在网上搜索“hibernate set remove not working”时,我发现了 hibernate 的真相:remove 方法有一些错误,因为 hashcode 和 equals 方法。看到之后我想也许 removeAll() 方法可以正常工作。我将相关的一个对象放入列表并将列表放入 removeAll 方法,它成功了。举个例子:

List childList = new ArrayList();
childList.add(child);
parent.removeAll(childList);
child.setParent(null);
Run Code Online (Sandbox Code Playgroud)