Hibernate JPA と Spring @Transactional
(Atomikos JTA 実装) を使用すると、システムに次のエンティティがあります。
- 注文
- Orderline (注文への参照を保持)
- お客様
I want to perform the following steps, in one transaction (これは 1 つのアトミック関数ブロックです) というaddOrder
注釈が付けられた Service クラス メソッドで。@Transactional
- 注文を維持する
- オーダーラインを維持する
- 顧客を維持する
ステップ 1 (注文の永続化) で、JPA に任意の をロールバックさせますException
。
ステップ 2 (オーダーラインの永続化) で、オーダーラインの永続化中のエラーを無視したいと考えています。したがって、10 個のオーダーラインがあり、そのうちの 1 つが何らかの理由 (制約違反など) で失敗した場合、他のオーダーラインを続行したいと考えています。
ステップ3Exception
でJPAにトランザクション全体をロールバックさせたい場合は、ステップ1と2で行ったすべてのこともロールバックします。
これまでに遭遇した問題:
- の場合、JPA はトランザクションを「ロールバックのみ」としてマークし
Exception
ます。Exception
したがって、これより後 (および前) はすべてロールバックされますが、ステップ 2 では無視したいと思います。 flush()
JPA は、 orcommit()
が呼び出された後 (通常は@Transactional
メソッドが終了した後)にのみ制約違反を認識します。メソッド内でそれを知る必要があります。- 各ステップを別々の
@Transactional
方法に分割しようとしましたが、同じものを使用する必要があるためTransaction
、前の 2 つの問題は変わりません。
これに最適なアプローチは何ですか?
アップデート
たとえば、すべての検証をJavaに入れ、レコードがすでに存在するかどうかを手動で確認する必要がありますか?