(エンティティ) オブジェクトのインスタンス化されていないリストを開くと、同じトランザクション内で前述のオブジェクトのいずれかに既に加えられた変更が元に戻るのはなぜですか?
シナリオ:
- A、B、C はすべてエンティティ
- A は、a.getB() で取得可能な B の特定のインスタンスへの参照を保持します。
- C には B オブジェクトのリストがあり、c.getListOfB() で取得できます。
- 以下は真です: c.getListOfB().contains(a.getB())
- 以下もテスト済みです: a.getB() == c.getListOfB().get(properIndex) (同じオブジェクト参照)
トランザクション内で次のことを行う場合:
B b = a.getB();
b.setOk(true); // <-- Changed from false to true
そして、次のように続けます。
c.getListOfB().isEmpty() // <-- Any function will do, I just used .isEmpty() to test it
次に b IMMEDIATELY は OK 値を再度 false に設定します:/
これは、DB にコミットする前に、同じトランザクション内で発生します。
トランザクション内で上記のエンティティに既に加えられた変更を EntityManager が認識していない理由と、変更を確実に保持する方法を教えてください。これにより、私は長いバグハントに導かれ、オンラインで役立つ結果を見つける方法について文字通り言葉を失いました.
編集: 問題は、リストを .isEmpty() メソッドでインスタンス化すると、JPA が DB から子オブジェクトを「もう一度」読み取り、トランザクションの早い段階でその子の 1 つに加えた変更を元に戻すことです。子オブジェクトの1つがすでに永続化コンテキストにあり、混乱していないことを知っておくべきだと思います。
現在、b に変更を加える前に c.getListOfB().isEmpty() を呼び出す、つまり List をインスタンス化することでこの問題を回避していますが、それは満足のいく解決策ではなく、問題の説明にはなりません。