2011-02-04 4 views
2

こんにちは私はそれを知っていて、オブジェクトがセッションに残っていないときに怠惰な初期化例外を防ぐために、マージがオブジェクトをセッションに再接続する前にテストします。Hibernate:many-to-oneオブジェクトとの作業を一時的にマージしますか?

)。だから私はいくつか質問があります。

私のお支払いの場合 - (多対一の一方向の関係で)>顧客と私は

支払支払= Payment.class.cast(session.merge(oldPayment))を行います。

カスタマーオブジェクトもセッションに再接続するか、顧客に対して別のマージコールを行う必要がありますか。

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

c。)私は3つ以上の階層の関係があるのですか?
例:ホテル - >支払い - >顧客。

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

ありがとうございました

答えて

2

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

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

JPA仕様と関連exceprt(私はネイティブのHibernateのSessionインタフェースは同じセマンティクスを提供しています推測):カスケード要素の値を持つXからの関係によって参照されるすべてのエンティティYについては

  • cascade=MERGEまたはcascade=ALL 、YはY 'として再帰的にマージされます。 Xによる を参照しているそのようなすべてのYについて、X 'は参照Y'に設定される。 (Xが管理されている場合、Xは Xと同じオブジェクトであることに注意してください「)
  • XはXにマージするエンティティである場合」次いで、cascade=MERGE 又はcascade=ALLが指定されていない別のエンティティYを参照して、 Xから同じ協会のナビゲーションがフェッチされていないY.フィールドをマージしてはならない永続性プロバイダは、LAZYをマークし

と同じ永続的なアイデンティティを持つ「管理対象オブジェクトYへ の参照を生み出す」:それは無視しなければなりません このようなフィールドはマージします。

も参照してください:

関連する問題