@Transactional
1 つの REST 呼び出しが 1 つのトランザクションであるため、Spring と JPA を使用して各メソッドにアノテーションが付けられた REST サービスを構築しています。ユーザーが依存関係を持つリソースで削除を呼び出そうとすると、hibernate は をスローしPersistenceException
、REST サーバー呼び出しがステータス 500 で返されるようにします。
これらの例外をキャッチし、カスタム エラー コードと元のメッセージを含む独自のエラー オブジェクトにラップします。
RuntimeExceptions
REST 呼び出しで単純にすべてをキャッチしてから、カスタム エラー オブジェクトを返すようにしました。ただし、トランザクションが中止されたという事実は私の方法の外で処理されるように見えるため、それは機能しません。
PersistenceException
また、DAOレベルで直接キャッチしようとしました。これは私の単体テストでは問題なく機能し、それらの外では何も変更されませんでした。DataIntegrityViolationException
また、Web コンテナーは、 の代わりに をスローすることで、独自の処理を行っているようPersistenceException
です。それはトレースにも表示されません。補足として、Hibernate が独自のものを処理すると思っていたので、これはややこしいことです。スプリングが干渉するのはなぜですか?
まあとにかく..私も使ってみました
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
RESTサービスメソッド内で成功しませんでした。
私はここで途方に暮れています.. によって開始されたトランザクションのエラー処理@Transactional
は私の手に負えないようです..?! アノテーションが別のスコープで処理されるプロキシを作成するためでしょうか?
を使用してトランザクションを手動で処理する唯一のオプションTransactionTemplate
ですか?