私は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クラスに追加しました - 同じ話。私のジレンマには簡単な解決策がありますか?
あなたの問題を十分に理解するには、 '@ Transactional'アノテーションと一緒に再生されるメソッドを示すいくつかのコードスニペットを参考にしてください。 –