EclipseLinkが永続性プロバイダであるJPAプログラムがあります。ユーザーエンティティをマージしてそのIDを変更し、同じユーザーインスタンスを再度マージしようとすると、エラーがスローされます。最も簡単な方法で問題を説明するためにコードを書き直します。エンティティをマージし、IDを変更して再度マージし、「データベースの主キー列にマップされ、更新は許可されません」エラー
User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
user.setId(2);
userManager.merge(user);
上記のコードはトランザクションコンテキストにはありません。 userManagerは、EntityManagerが注入されたステートレスセッションBeanです。
User is managed? false
Exception [EclipseLink-7251] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.ValidationException
Exception Description: The attribute [id] of class [demo.model.User] is mapped to a primary key column in the database. Updates are not allowed.
2番目のmerge()呼び出しで例外が発生します。
私は、新しいユーザーを作成する場合は、そのIDを設定し、それが動作しますが、それをマージ:
User user = userManager.find(1);
userManager.merge(user);
System.out.println("User is managed? "+userManager.contains(user);
User newUser = new User();
newUser.setId(2);
userManager.merge(newUser);
だから、最初のシナリオ2つ目の違いは何ですか? JPA仕様によれば、エンティティが分離状態にある限り、マージは成功するはずです。 (ID = 2のエンティティが存在すると仮定します)
なぜ、ユーザーエンティティが以前にマージされているという事実に悩まされているようですか?
更新:これはEclipseLinkのバグのようです。私はHibernateにEclipseLinkをから持続性プロバイダを交換しました:
私は
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
にエラーがスローされていない変更します。
あなたのIDは生成された値ですか? – kostja
はい、生成された値です –