2017-12-13 13 views
0

私は春の起動アプリケーションで作業しています。リストを通過し、休止状態でデータベースに複数のコミットを実行するいくつかのメソッドがあります。Hibernate Transactional Commits

たとえば、フロントエンドからユーザーが変更したオブジェクトを受け取り、そのオブジェクトに多数のサンプルが関連付けられており、各サンプルには多数のテストが関連付けられています。

このシナリオでは、オブジェクトのコピー、サンプル、およびテストを生成して保存する必要があります。

中間のどこかで例外が発生した場合、hibernateは最新のコミットアクションのみをロールバックします。しかし、私は最初からすべてを戻す必要があります。

私はまだ複数のテーブルにまたがって保存しているので、複数のrepository.save()呼び出しを実行しているメソッドがあって何かがうまくいかない場合はどうすればよいですか?このトランザクション中に実行したすべてのsave()アクションをロールバックしますか?

これは私のために私の機能を置くことができる注釈はありますか?サービスから法上の注釈怒鳴るを使用して

+0

あなたはこれまでに(コードワイズ)何を試しましたか? –

+0

私はまだ何も試していません。私は、Hibernateが私のために物事を返すだろうという前提の下にありましたが、これは単一の.save()または一括保存の場合にのみ当てはまります。別の.save()コールを作成するとすぐに、2番目の間に何かがうまくいかない場合、最初のものをロールバックしません。私は、生成されているPKを追跡し、catch()を削除することを考えていましたが、複数のコミットアクションがあっても、Spring/Hibernateにすべてをロールバックさせる良い方法が必要です。 –

+0

メソッドの開始時にリポジトリの一時的なインスタンスを作成したり、おそらくすべてのデータを個別に保存したりすることができます。エラーが発生した場合は、メインリポジトリのインスタンスを保存した一時インスタンスにリセットします。それは本当に私が考えることができるすべてのものです –

答えて

1

は、あなたを助ける必要があります。

@Transactional(rollbackFor = Exception.class) 

あなたがどこかのサービスメソッドで例外をスローする必要がありますし、スローエラーが発生した場合の春は、トランザクションをロールバックします。

+0

はい、ありがとうございます。ドキュメンテーションを掘り下げた後、私はこれを見つけました。私は '@Transactional(" oracleTransactionManager ")を自分のServiceメソッドに置いて、Create、Update、Deleteメソッドを呼び出す必要があるかどうかを決めます。これにより、すべての処理が完了するまで、単一の@Transactionalインスタンスが他のすべてのメソッドを伝播することができます。完璧に動作します。 –

関連する問題