gpt4 book ai didi

java - 如何在更新 parent 时删除 child ?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:24:01 28 4
gpt4 key购买 nike

我有“父”和“子” hibernate 实体。

在“父级”上我有一个 Set<Child>抱它的 child 。

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

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

这里是:

在 PARENT(命名工作流)上:

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

关于 child (命名 Activity )

@ManyToOne
@JoinColumn(name="id_workflow")
@Fetch(FetchMode.JOIN)
private WorkflowDB workflow;

我正在处理 session 中的持久实例。不会引发错误。似乎工作正常,但数据库上的注册仍然存在。

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

workflow.activities.remove( activity_index_x )

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

最佳答案

确保您阅读了有关 bidirectional association links 的手册.

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

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);
}
}

}

但是因为你使用一个Set作为一对多的一方,你需要格外注意equals and hashcode .最好的方法是使用业务 key 来检查相等性和哈希码算法,并且永远不要使用数据库标识符来表示 equals/hashcode,尤其是与类似哈希的数据结构(set/map)结合使用时。

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

关于java - 如何在更新 parent 时删除 child ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24704964/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com