Hibernate EntityExistsException在兄弟类处于持久性上下文中时,使用@MapsId持久化第二个实体

Hibernate EntityExistsException在兄弟类处于持久性上下文中时,使用@MapsId持久化第二个实体,hibernate,joined-subclass,Hibernate,Joined Subclass,我有一个奇怪的问题,我真的解决不了。这是一个例外: javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [com.mycompany.Employee#101] at org.hibernate.ejb.AbstractEntityManagerImpl.convert(Abst

我有一个奇怪的问题,我真的解决不了。这是一个例外:

javax.persistence.EntityExistsException: a different object with the same identifier value was already associated with the session: [com.mycompany.Employee#101]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1359) [hibernate-entitymanager-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310) [hibernate-entitymanager-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316) [hibernate-entitymanager-4.2.2.Final.jar:4.2.2.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881) [hibernate-entitymanager-4.2.2.Final.jar:4.2.2.Final]
例外情况很明显,持久化上下文中有一个对象阻止我的
持久化
。问题是:上下文中根本没有
Employee
(通过调试器检查)

但是,有一个
人才
实例我想更新为
员工
。它们是这样联系的:

一个人:

public class Person {
    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "person")
    private Set<PersonRole> roles = new LinkedHashSet<>();
}
而且
人才
员工
扩展
个人角色
(这里没有特别的内容)

当一个人已经是一个天才,而我引用一个现有的人来构造一个雇员并调用

entityManager.persist(new Employee(person))
现在,
PersonRole
中的@Id映射看起来不太合理,有人能确认这是导致上述异常的问题吗?我怎样才能做得更好


我想表达的是,每个角色都有一个附加的人,唯一地标识该角色的实例。查看持久性上下文,Hibernate似乎使用
PersonRole#person.id
作为
EntityKey
,这似乎导致了异常。

将其全部输入有助于自己回答问题:

我不希望@MapsId出现在
PersonRole#person
上,因为角色不应该由个人单独识别。事实上,如果这个角色可以被这个人识别,那么它只是这个人的另一个属性,而不是一个新角色

所以我最初的地图设计是错误的。不使用@MapsId会使异常消失

entityManager.persist(new Employee(person))