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))