2016-11-04 9 views
0

私はSpring Bootアプリケーションを持っており、そのクラスとそれをとっている学生との間のリンクを含むCollegeCourseインスタンスのモデルをユーザーがPOSTできるWebサービスを持っています。 (データは関連テーブルに行を格納するために使用されます。これらのクラスには多対多の関係があるためです)。これは問題なく動作します。@Transactionalシーケンスの一部をコミットできますか?

コースの登録内容が変更されたとします。ユーザーは、PUT呼び出しを処理するWebサービスに同じJSON構造を送信することを想定しています。このコードでは、既存のCollegeCourse-Studentリンクをすべて見つけて削除してから、新しいリンクを保存して更新するための簡単な方法をとっていました。 (2つのリストを反復して項目を合わせるのではなく)この部分も与えられたとおりに機能しました。

次に、CollegeCourse-Student関連テーブルに一意性制約を追加しました。このため、1つのStudentが1つのCollegeCourseに複数回リンクされていないようにしました。これは墜落して燃えた。デバッグセッションでは、CollegeCourse-Studentレコードを削除しても、トランザクションが完了するまでデータベースから削除されませんでした。したがって、新しいリンクを追加しようとすると、オリジナルのPOSTからの保持は、すでにデータベース内のものと競合していました。

PUTを処理するサービスの前には、@ Transactionalアノテーションがあります。別の方法で関連付けを見つけたり削除したりするためにコードを移動しようとしましたが、@Transactional(propagation = Propagation.REQUIRED)とREQUIRES_NEWの両方を試みましたが、どちらも一意性制約の失敗を防ぎませんでした。また、@EnableTransactionManagementを私のApplicationクラスに追加しました - 同じ話。私のジレンマには簡単な解決策がありますか?

+0

あなたの問題を十分に理解するには、 '@ Transactional'アノテーションと一緒に再生されるメソッドを示すいくつかのコードスニペットを参考にしてください。 –

答えて

0

あなたのリポジトリの外観を正確に知らないと、削除後にエンティティマネージャを手動でフラッシュしようとしましたか?

entityManager.flush(); 

それとも、あなたは春データJPAリポジトリを使用している場合、あなたはそのインターフェイスでflushメソッドを定義し、それを呼び出すことができるはずの線に沿って

何か。

+0

私は自分のリポジトリに(CrudRepositoryに基づいて)flushメソッドを追加し、内部トランザクションとして実行できるようにしました。月曜日に、外部トランザクションがまだアクティブであることを確認し、他のエラーが発生した場合にロールバックすることができます。 – LitterWalker

関連する問題