1

OptimisticLockException管理対象エンティティ EJB を更新しようとするとエラーが発生します。

EJB は次の方法でフェッチされました。

port = entityManager.find(PortEntity.class, portID);

次に、EJB と entityManager が SAX に渡されContentHandlerendDocuent()メソッド内で更新できるようになります。はContentHandler、Google のタイム ゾーン API サーバーから返されたデータからタイム ゾーン情報を抽出しています。

コード スニペットは次のとおりです。

entityManager.refresh(port);
if (entityManager.contains(port))
    log.info("Contained: " + port);
else
    log.info("NOT Contained: " + port);

port.setTimezone(toTimezone);
entityManager.flush();   // <-- Line 70 

ログファイルには次のように表示されます。

13:48:05,568 INFO  [GeotimezoneHandler] Status: OK
13:48:05,569 INFO  [GeotimezoneHandler] Raw offset: 3600.0000000
13:48:05,570 INFO  [GeotimezoneHandler] DST offset: 0.0000000
13:48:05,570 INFO  [GeotimezoneHandler] Timezone ID: Europe/Madrid
13:48:05,571 INFO  [GeotimezoneHandler] Timezone Name: Central European Standard Time
13:48:05,577 INFO  [GeotimezoneHandler] Contained: SeaPort[id=ESBCN, name=Barcelona]
13:48:05,591 ERROR [GeotimezoneHandler] Updating curise: javax.persistence.OptimisticLockException: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.nutrastat.voyager.entity.PortEntity$Sea#ESBCN]
    at org.hibernate.ejb.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:1390) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1308) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1289) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1295) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:976) [hibernate-entitymanager-4.0.1.Final.jar:4.0.1.Final]
    at org.jboss.as.jpa.container.AbstractEntityManager.flush(AbstractEntityManager.java:439) [jboss-as-jpa-7.1.1.Final.jar:7.1.1.Final]
    at com.nutrastat.voyager.util.GeotimezoneHandler.endDocument(GeotimezoneHandler.java:70) [voyager-lib.jar:]

では、EJB が含まれている場合、entityManager変更後に例外が発生するのはなぜですか?

いつもお世話になっております

スティーブ

PS

このスレッドを確認しましたが、MySQL データベースは InnoDB を使用していますがSELECT @@tx_isolation;、コード内からコマンドを実行する方法がわかりません。

4

1 に答える 1

0

2日間の調査の後、私はついに問題が何であるかを発見しました.

javax.persistence.Versionスーパークラス aフィールドから継承されたエンティティ クラス。また、テーブルに手動でデータを挿入しました。バージョン フィールドは null を許可するように定義されていたため、わざわざ値を挿入する必要はありませんでしたが、値が必要でした。

于 2013-02-27T19:10:27.247 に答える