1

ユーザーオブジェクトをセッション中に保持します。初めて更新するとき(entityManager.merge(ent)を使用)、正常に機能します。しかし、2回目は次の例外が発生します。

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.kids.domain.Child#22]
    at org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:492)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:256)
    at org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:86)
    at org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:781)
    at org.hibernate.internal.SessionImpl.merge(SessionImpl.java:766)

私はHibernateとJPAでSpringを使用しています。SpringはDAOにEntityManagerを注入しています。毎回新しいfind()を実行し、そのオブジェクトにすべての変更を加えてから、merge()を実行する場合は、正常に機能することを理解しています。しかし、私の場合はそれができません。

また、使用されているEntityManagerのハッシュコードが両方とも同じであることを確認しました。つまり、同じEntityManagerインスタンスが両方の時間で使用されているのに、レコードを2回更新しようとしたときにこの例外が発生するのはなぜですか。

どんな助けでも大歓迎です。

4

2 に答える 2

2

私は多くのことを試しましたが、何もうまくいきませんでした。インターネットでも解決策はありませんでした。最後に、エンティティからバージョンを削除すると (つまり、hibernate によって提供される OptimisticLockException サポートを削除します)、すべて正常に動作し始めました。おそらく、自分で OLE を処理してみます。

于 2012-07-04T08:00:39.630 に答える
0

現在のトランザクションでマージ メソッドを呼び出すと、hibernate は指定されたオブジェクトの状態を同じ識別子を持つ永続オブジェクトにコピーし、新しい管理可能なエンティティを返します。このエンティティはDBよりも新しいバージョンであるため、後続の操作でマージによって返される管理可能なエンティティで作業する必要があります。

于 2012-07-03T13:06:44.030 に答える