3

JBoss 7.1.1 とそれに付属する Hibernate のデフォルト実装 (4.0.1) を使用しています。同じトランザクションでエンティティを作成し、エンティティマネージャーを使用して永続化するメッセージ駆動型 Bean があります。その後 (まだ同じトランザクション)、新しく作成されたエンティティを見つけ、エンティティ マネージャを使用して PESSIMISTIC_WRITE でロックしようとしましたが、OptimisticLockException が発生しました。そのルートは次のとおりです。

Caused by: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [some.package.name.EntityName#aaa1a1a0-d568-11e1-9f99-d5a00a0a12b6]
    at org.hibernate.dialect.lock.PessimisticWriteSelectLockingStrategy.lock(PessimisticWriteSelectLockingStrategy.java:95)
    at org.hibernate.persister.entity.AbstractEntityPersister.lock(AbstractEntityPersister.java:1785)
    at org.hibernate.event.internal.AbstractLockUpgradeEventListener.upgradeLock(AbstractLockUpgradeEventListener.java:99)
    at org.hibernate.event.internal.DefaultLockEventListener.onLock(DefaultLockEventListener.java:85)
    at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:693)
    at org.hibernate.internal.SessionImpl.fireLock(SessionImpl.java:686)
    at org.hibernate.internal.SessionImpl.access$1100(SessionImpl.java:160)
    at org.hibernate.internal.SessionImpl$LockRequestImpl.lock(SessionImpl.java:2164)
    at org.hibernate.ejb.AbstractEntityManagerImpl.lock(AbstractEntityManagerImpl.java:1093)
    ... 202 more

新しく作成されたエンティティを検索できない理由はありますか? また、作成した直後に検索できるようにするにはどうすればよいですか? EM のマージ メソッドを使用しても役に立たないようです ...

4

1 に答える 1

2

あなたの質問に対する私の理解は、メッセージ駆動型 Bean のトランザクション内で次のことを行っているということです。

1. Create entityA
2. Persist entityA
3. entityB = find entityA
4. lock(entityB, PESSIMISTIC_WRITE)

ステップ4は例外をスローしています。

Hibernate は 2 と 3 の間で永続化をフラッシュしていない可能性があるため、その時点で A (および B) はバージョン 0 を持っていると思います。Hibernate は lock() の開始時に A の永続化をフラッシュしています。つまり、B は古い状態になっています。バージョン。

検索の前に永続化をフラッシュしてみることができます (つまり、2 の後に entityManager.flush())。

または、検索をスキップできるはずです。entityManager.persist(entityA) は entityA を管理対象オブジェクトにするため、次のシーケンスが機能する可能性があります。

1. Create entityA
2. Persist entityA
3. lock(entityA, PESSIMISTIC_WRITE)
于 2012-07-24T11:41:40.407 に答える