10

EclipseLink が Persistence プロバイダーである JPA プログラムがあります。ユーザー エンティティをマージし、その 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 プロバイダーが悩まされているように見えるのはなぜですか?

更新: EclipseLink のバグのようです。持続性プロバイダーを EclipseLink から Hibernate に置き換えました。

私が変える

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<provider>org.hibernate.ejb.HibernatePersistence</provider>    

エラーはスローされていません。

4

4 に答える 4

4

その理由はId、最初の例で試したように、2 番目の例のように挿入/定義できるが、変更/更新できない可能性があるためです。JPA プロバイダーは、変更をデータベースに反映しようとしますが、失敗します。

JPA 2仕様§2.4は言う

アプリケーションは、主キーの値を変更してはなりません。これが発生した場合の動作は未定義です。

于 2012-09-11T07:51:12.090 に答える
3

EclipseLink のバグのようです。持続性プロバイダーを EclipseLink から Hibernate に変更しました。

から

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

<provider>org.hibernate.ejb.HibernatePersistence</provider>  

エラーはスローされていません。

EclipseLink のバージョンは 2.3.2 です。(最新の Glassfish アプリケーション サーバー 3.1.2 に同梱されています)。

hibernate のバージョンは、現時点で最新の 4.1.7 です。

于 2012-09-13T05:26:52.517 に答える
2

http://blogs.nologin.es/rickyepoderi/index.php?/archives/95-Weaving-Problem-in-EclipseLink.html<property name="eclipselink.weaving.internal" value="false"/>に従ってpersistence.xmlを 試してください

于 2015-08-17T17:26:04.803 に答える