如何在更新父母时删除孩子?

Mag*_*o C 5 java orm hibernate jpa hibernate-mapping

我有“父”和“子”休眠实体。

在“父母”上,我有一个Set<Child>持有它的孩子。

当我用新的孩子更新 Parent 时,一切正常:孩子是在“child”表上创建的。

但是,当我从父哈希集中删除一个元素并保存时,不会删除数据库上的对应子项。

这是:

在 PARENT(命名为工作流)上:

@OneToMany(orphanRemoval=true, cascade = CascadeType.ALL, mappedBy="workflow", fetch = FetchType.EAGER)
private Set<ActivityDB> activities; 
Run Code Online (Sandbox Code Playgroud)

关于孩子(命名活动)

@ManyToOne
@JoinColumn(name="id_workflow")
@Fetch(FetchMode.JOIN)
private WorkflowDB workflow;
Run Code Online (Sandbox Code Playgroud)

我正在会话中处理持久性实例。没有出现错误。似乎工作正常,但数据库上的寄存器仍然存在。

为了进行测试,我加载工作流并执行

workflow.activities.remove( activity_index_x )
Run Code Online (Sandbox Code Playgroud)

然后使用session.update( workflow ). 但是“activity_index_x”仍然在数据库中,当我重新加载工作流程时,它会再次出现。

Vla*_*cea 1

请务必仔细阅读有关双向关联链接的手册。

最佳实践包括添加添加/删除子方法:

class WorkflowDB {

    public void remove (ActivityDB a) {
        if (a != null) {
            this.activities.remove(a);
            a.setWorkflow(null);
        }
    }

    public void add (ActivityDB a) {
        if (a != null) {
            this.activities.add(a);    
            a.setWorkflow(this);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

但是因为您使用 Set 作为一对多端,所以您需要额外注意equals 和 hashcode。最好的方法是使用业务密钥来检查相等性和哈希码算法,并且永远不要将数据库标识符用于 equals/hashcode,特别是与类似哈希的数据结构(集合/映射)结合使用。

双向关联比单向关联管理起来更复杂。如果您确实不需要一对多方面,则可以将其删除并用查询替换。这样你就只需管理多对一的方面。