0

私は本当に解決できない奇妙な問題を抱えています。それはこの例外です:

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;
}

そして両方TalentEmployee拡張PersonRoleします(そこに特別なものはありません)。

人がすでに才能であり、既存の人を参照して従業員を作成し、呼び出すと、例外が発生します

entityManager.persist(new Employee(person))

での @Id マッピングはPersonRoleあまり健全に見えません。上記の例外を引き起こしている問題であることを誰かが確認できますか? そして、どうすればもっとうまくやれるでしょうか?

私が表現したかったのは、各ロールには、ロールのインスタンスを一意に識別する人が関連付けられているということです。Persistence Context を見ると、Hibernate が として使用PersonRole#person.idしてEntityKeyいるように見えますが、これが例外を引き起こしているようです。

4

1 に答える 1

1

すべてを入力すると、自分で質問に答えるのに役立ちました。

@MapsId を on にしたくありませんPersonRole#person。ロールはその人だけで識別されるべきではないからです。実際、役割がその人によって特定できたとしても、それはその人の別の特性であり、新しい役割ではありません。

つまり、私の元のマッピング デザインは不完全でした。@MapsId を省略すると、例外がなくなります。

于 2013-08-05T13:57:20.107 に答える