私は本当に解決できない奇妙な問題を抱えています。それはこの例外です:
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]
persist
例外は、私の通過を妨げる永続コンテキストにオブジェクトがあることは明らかです。問題はEmployee
、コンテキストにまったくないことです(デバッガーでチェックしてください)!
ただし、Talent
更新してEmployee
. それらは次のように関連しています。
人:
public class Person {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "person")
private Set<PersonRole> roles = new LinkedHashSet<>();
}
多くの役割があります:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class PersonRole {
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "personrolegen")
@SequenceGenerator(name = "personrolegen", sequenceName = "person_role_id_seq")
protected Long id;
@MapsId
@ManyToOne(optional = false)
protected Person person;
}
そして両方Talent
とEmployee
拡張PersonRole
します(そこに特別なものはありません)。
人がすでに才能であり、既存の人を参照して従業員を作成し、呼び出すと、例外が発生します
entityManager.persist(new Employee(person))
での @Id マッピングはPersonRole
あまり健全に見えません。上記の例外を引き起こしている問題であることを誰かが確認できますか? そして、どうすればもっとうまくやれるでしょうか?
私が表現したかったのは、各ロールには、ロールの子インスタンスを一意に識別する人が関連付けられているということです。Persistence Context を見ると、Hibernate が として使用PersonRole#person.id
してEntityKey
いるように見えますが、これが例外を引き起こしているようです。