Hibernate(JPA):いくつかのオブジェクトが変更され、コミットされたときにstaleObjectStateExceptionを処理する方法

StackOverflow https://stackoverflow.com/questions/4838786

質問

シナリオを考えてみましょう。バージョン化を備えた異なるテーブルから複数の行を環境に導くDBトランザクション。

例:ショップリストと製品。ショップリストには製品が含まれている場合(ショップリストに金額が含まれています)、製品には現在の在庫があります。

OU編集ショップリストを挿入するとき、Shoplistのそれらの製品の在庫を更新して、在庫を一貫性を保つことを望みます。

そのために、トランザクションを開き、ShopListを挿入/更新し、各製品の在庫を更新し(Deltaを適用)、トランザクションをコミットします。今まで大したことはありません。

ただし、他のユーザーは1つ以上の製品を共通して更新している可能性があります。または、ShopList自体を更新しました。どちらの場合も、トランザクションをコミットするときにStaleObjectStateExceptionを取得します。

質問:StaleObjectStateExceptionを引き起こしたテーブルを決定する方法はありますか?

製品が例外を引き起こした場合、DBからすべての環境製品をリフレッシュしてから、ストックデルタを再適用することができました。そして、それは大丈夫です。 ShopListが例外を引き起こした場合は、問題を単にユーザーに報告して、再びやり直すことができるようにすることをお勧めします。

ご協力ありがとうございます。

役に立ちましたか?

解決

私はその方法を見つけました。

まず最初に:JPA(またはHibernate自体)は、org.hibernate.staleObjectStateExceptionの例外をjavax.persistence.optimisticlockexceptionとして包みます。したがって、適切な例外をキャッチしたい場合は、OptipicisticLockexceptionにアクセスしてください。

2番目:Hibernateは、EntityManagerのメソッドフラッシュ前にCOMPを呼び出す場合にのみ、楽観的なLockexceptionを投げます。 Commitを直接呼び出すと、代わりに別の例外が得られます(私はどちらを忘れました)。ほぼ全員がコミット方法によって発行された例外をキャッチし、トランザクションロールバックに移動することを考慮すると、ロールバックの関連する例外が得られます(どちらをもう一度思い出せません)。

私の元の質問に答える3番目で最後の質問:バージョン化エラーの起源を取得するには、sorpisticlockexceptionインスタンスからgetEntityメソッドを呼び出す必要があります。それはあなたがそれに関連する必要があるものをあなたに提供するつもりです。

ここを通り過ぎてくれたすべての人に感謝します。それに関する質問はどんな質問でも、聞いてください、そして私は喜んで助けてくれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top