次の問題があります。私は、RESTサービスを提供するスプリングブートアプリケーションで作業しています。 SQL)データベースを使用しています。Springトランザクションの伝播:作成および相談操作に同じトランザクションを使用すると@OneToMany関連エンティティを取得できません
私は2つのRESTサービスを持っています: - 子エンティティ、親エンティティを作成し、それらを同じトランザクションで関連付けるエンティティ作成サービス。このサービスが終了すると、データはデータベースにコミットされます。 - 子エンティティを持つ親エンティティを返すエンティティ相談サービス
これらの2つのサービスには@Transactionalアノテーションが付いています。それはうまくいっています。私は親トランザクションと子トランザクションを1つのトランザクション(コミット/終了)で作成し、別のトランザクションで取得することができます。
問題は、統合テストを作成するときです。私の考えは、@Transactionalアノテーションで各テストに注釈を付け、各テスト後にロールバックを行うことでした。この方法では、各テストの間にデータベースをきれいに保ちますが、スキーマを再度生成したり、データベース内のすべてのレコードを消去したりする必要はありません。
統合テストでは、親とその子を作成してから、1つのトランザクション内にすべてを読み込みます(テストには@Transactionというアノテーションが付けられています)。以前同じトランザクションで作成されたエンティティを読み込むと、親エンティティを取得できますが、子はフェッチされません(null値)。私はトランザクションメカニズムをよく理解していません。テストメソッドで@Transactionalを使用すると、このテストで呼び出されたサービス( "@Transactional"で注釈が付けられたサービス)がテストで開かれた同じトランザクションを検出して使用する必要があると考えていました(伝播は「必須」に設定されています)。したがって、トランザクションで同じEntityManagerが使用されるため、データがデータベースにコミットされていなくても、同じトランザクションで以前に作成された親エンティティと子の間のリレーションを返すことができます。奇妙なことは、親エンティティ(まだデータベースにコミットされていない)を取得しますが、その子は取得しないことです。取引コンセプトの理解は正しいですか?そうでない場合、誰かが私に何が欠けているか説明できますか?
また、誰かが同様のことをした場合、彼がどのようにしてくれたかを私に説明することができますか?
私のコードはかなり複雑です。私は最初にトランザクションがどのように管理されているか、誰かがすでに何か類似しているかどうかをよく理解しているかどうかを知りたい。本当に必要な場合は、実装に関する詳細情報(トランザクションマネージャとエンティティマネージャの初期化方法、JPAエンティティ、サービスなど)を送信できます。