0

(エンティティ) オブジェクトのインスタンス化されていないリストを開くと、同じトランザクション内で前述のオブジェクトのいずれかに既に加えられた変更が元に戻るのはなぜですか?

シナリオ:

  • 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 をインスタンス化することでこの問題を回避していますが、それは満足のいく解決策ではなく、問題の説明にはなりません。

4

2 に答える 2

0

同じインスタンスが使用されるように、変数を静的にします。

于 2013-08-26T03:12:57.783 に答える
0

a.getB() == c.getListOfB().get(properIndex) は正しくありません。

2 つのオブジェクトを比較するときは、「==」の代わりに equals() メソッドを使用してください

== はオブジェクト参照を比較します。

equals() オブジェクトのプロパティを比較します。

あなたの場合、エンティティ オブジェクトの 1 つのプロパティであるそのオブジェクトの主キーを比較する必要があります。

以下は真です: c.getListOfB().contains(a.getB())

以下も当てはまります: a.getB().equals(c.getListOfB().get(properIndex))

a.getB() と c.getListOfB().get(properIndex) の呼び出し中に hibernate が同じ参照インスタンスを返すかどうかわからないので、2 つのオブジェクト プロパティを比較するときに == を使用しないでください

于 2013-08-26T04:10:20.060 に答える