java - 将实体移动到另一个拥有的 OneToMany 集合中
问题描述
在我的应用程序中,有一个 Person 实体,它具有许多 PersonRole 类型的角色。
@Entity
public class Person {
@OneToMany(mappedBy = "person",
cascade=CascadeType.ALL,
orphanRemoval=true,
fetch=FetchType.LAZY)
protected Set<PersonRole> roles;
...
}
@Entity
public abstract class PersonRole {
@ManyToOne
protected Person person;
...
}
有时数据库中有重复的人,我正在尝试实现一个函数将这两个人合并为一个。由于 PersonRole 还附加了一些权限,我不想删除并重新创建它,我想将它从死亡的人移动到幸存的人:
for (PersonRole role : dieing.getRoles()) {
role.mergeInto(surviving);
}
dieing.getRoles().clear();
PersonRole 中的方法如下所示:
public void mergeInto(Person surviving ) {
this.person = surviving;
surviving.getRoles().add(this);
}
不幸的是,它不起作用。当我运行它时,PersonRoles 被删除并且没有添加到幸存的人中。
我需要更改什么,以便通过 surviving.roles 关系添加和保留它们?
解决方案
我找到了解决方案:
dieing.getRoles().clear();
错了。我删除了那条线,现在它可以工作了。
虽然这是一个解决方案,但我对 JPA / Hibernate 在这里的工作方式并不满意。幸存的人正在从“死亡”的人身上“偷走”实体,而“死亡的”人没有首先释放它们。因此,如果我在冲洗后不 em.update(dieing),我有一个矛盾的模型。
推荐阅读
- r - 通过变量迭代计算预测模型结果
- r - 不能从 R 中压缩目录而不包括完整的文件路径
- asp.net - Azure AD 中的 jwt-bearer 代表授权问题
- html - 使用类更改ul li中的字体颜色
- ansible - Make ansible ignore variable in template when checking changed state
- javascript - Javascript - 按钮的 rowIndex 在表格中不起作用
- kotlin - 有没有办法在 Kotlin 单例对象上隐藏实例变量
- user-interface - JavaFX 聊天窗口,如 Facebook 聊天
- python-3.x - 在 Pandas 中打开 csv 文件后将 int 分配给字符串值
- numpy - 使用 pyspark 创建和操作 numpy 数组并使用数据