Java 将实体移动到另一个拥有的OneToMany集合中

Java 将实体移动到另一个拥有的OneToMany集合中,java,hibernate,jpa,hibernate-cascade,orphan-removal,Java,Hibernate,Jpa,Hibernate Cascade,Orphan Removal,在我的应用程序中,有一个Person实体,它有许多PersonRole类型的角色 @Entity public class Person { @OneToMany(mappedBy = "person", cascade=CascadeType.ALL, orphanRemoval=true, fetch=FetchType.LAZY) protected Set

在我的应用程序中,有一个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中的方法如下所示:

public void mergeInto(Person surviving ) {
    this.person = surviving;
    surviving.getRoles().add(this);
}
不幸的是,它不起作用。当我运行它时,PersonRoles被删除,而不是添加到幸存的人

我需要更改什么,以便通过surviving.roles关系添加和持久化它们?

我找到了解决方案:

dieing.getRoles().clear();
他错了。我去掉了那条线,现在它可以工作了


虽然这是一个解决方案,但我对JPA/Hibernate在这里的工作方式不满意。幸存的人正在从“死亡”的人那里“窃取”实体,而“死亡”的人没有首先释放它们。因此,如果我在冲水后不更新em.update(dieing),我就有了一个矛盾的模型。

我不知道这些是如何持续的。您是否将更新后的Person对象保存回某个现有存储库中,或者保存在我们没有看到的代码中?您更改Person对象上的角色,但mergeInto()是一个无效方法,因此,在对死亡角色调用clear()之前,您不会返回任何内容或将其保存在该方法中的某个位置。Person实体已附加到my EntityManager,因此任何更改都会保留到数据库中
dieing.getRoles().clear();