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”仍然在数据库中,当我重新加载工作流程时,它会再次出现。
请务必仔细阅读有关双向关联链接的手册。
最佳实践包括添加添加/删除子方法:
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,特别是与类似哈希的数据结构(集合/映射)结合使用。
双向关联比单向关联管理起来更复杂。如果您确实不需要一对多方面,则可以将其删除并用查询替换。这样你就只需管理多对一的方面。
| 归档时间: |
|
| 查看次数: |
3172 次 |
| 最近记录: |