【问题标题】:moving an entity into another owned OneToMany Collection将实体移动到另一个拥有的 OneToMany 集合中
【发布时间】:2021-07-18 16:46:41
【问题描述】:

在我的应用程序中,有一个 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 还附加了一些权限,我不想删除并重新创建它,我想将它从死亡的 Person 移动到幸存的 Person:

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 关系添加和保留它们?

【问题讨论】:

  • 我很困惑这一切是如何持续存在的。您是否将更新的 Person 对象保存回某个现有存储库或我们没有看到的代码中?您更改 Person 对象上的角色,但是 mergeInto() 是一个 void 方法,因此,在对即将死去的角色调用 clear() 之前,您不会返回任何内容或保存该方法内的某个位置。
  • Person 实体已附加到我的 EntityManager,因此任何更改都会保存到数据库中

标签: java hibernate jpa hibernate-cascade orphan-removal


【解决方案1】:

我找到了解决办法:

dieing.getRoles().clear();

错了。我删除了那条线,现在它可以工作了。

虽然这是一个解决方案,但我对 JPA / Hibernate 在这里的工作方式并不满意。幸存的人从“死去的”人身上“偷走”实体,而“死去的”人没有首先释放它们。因此,如果我在刷新后不 em.update(dieing),我就有一个矛盾的模型。

【讨论】:

    猜你喜欢
    • 2010-12-05
    • 1970-01-01
    • 2016-02-28
    • 2015-01-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2021-12-04
    相关资源
    最近更新 更多