2

こんにちは私はそれを知っており、マージの前にテストすると、オブジェクトがセッションに再接続され、オブジェクトがセッションに存在しなくなったときに遅延初期化例外が発生するのを防ぎます。

a。)それで私はいくつか質問があります。

私が支払い->顧客(多対1の一方向の関係で)と私がする場合

支払い支払い=Payment.class.cast(session.merge(oldPayment));

顧客オブジェクトもセッションに再接続されますか、それとも顧客に対して別のマージ呼び出しを行う必要がありますか?

b。)支払い->顧客(多対1の双方向関係)の場合はどうなりますか。何が起こるだろう。

c。)3つ以上の階層の関係がある場合はどうでしょうか。
例:ホテル->支払い->顧客。

Hotel hotel = Hotel.class.cast(session.merge(unmergeHotel))を実行した場合、支払いと顧客オブジェクトもセッションにマージされますか?

ありがとう

4

1 に答える 1

2

それはあなたの関係のカスケードオプションによって定義されます。

  • リレーションシップがマージ操作をカスケードするように構成されている場合、マージされるエンティティから参照されるエンティティもマージされるため、マージ前にこれらのエンティティに加えられた変更はデータベースに伝播されます。
  • それ以外の場合、これらのエンティティはデータベースから再ロードされるため、マージ前にこれらのエンティティに加えられた変更はすべて破棄されます。
  • 初期化されていない遅延関係は無視されます。

JPA仕様からの関連する抜粋(ネイティブのHibernateのSessionインターフェースは同じセマンティクスを提供すると思います):

  • cascade=MERGEカスケード要素値または、を持つXからの関係によって参照されるすべてのエンティティYについて cascade=ALL、YはY'として再帰的にマージされます。Xによって参照されるそのようなすべてのYについて、X'はY'を参照するように設定されます。(Xが管理されている場合、XはX'と同じオブジェクトであることに注意してください。)
  • XがX'にマージされたエンティティであり、別のエンティティYへの参照がある場合cascade=MERGE (またはcascade=ALL指定されていない場合)、X'からの同じ関連付けのナビゲーションにより、Yと同じ永続IDを持つ管理対象オブジェクトY'への参照が生成されます。

永続性プロバイダーは、フェッチされていないLAZYとマークされたフィールドをマージしてはなりません。マージするときにそのようなフィールドを無視する必要があります。

参照:

于 2011-02-04T10:15:36.317 に答える