2016-11-22 13 views
1

オブジェクトが分離エンティティであるかどうかをHibernateがどのように識別しているのだろうか。私は、特定の方法を求めていない、ちょうどその背後にあるメカニズムを理解したい。Hibernateで分離されたエンティティを確認する

+0

基本的に、各セッションには、そのセッション内のすべてのエンティティを含むIdentityHashMapがあります。 –

+0

これは良い質問ではないかと思います。 StackOverflowでは、あなたが自分自身を見つけるために何らかの努力をしたことを実証するはずです。この質問に答える唯一の方法は、Hibernateのソースコードを読んで、彼らがどのようにして行ったかを正確に調べることです。私たちの誰もがどうしようもないと思うかもしれませんが、誰もソースコードを読まずに答えを知る人はいません。あなたはソースコードTuanで自分自身を見つけようとしましたか?もしそうなら、あなたはどこまで手に入れましたか?おそらくJB Nikizetは正しいでしょう。おそらくJB NizetはHibernateの開発者であり、まさに彼らのやり方です。 – DavidS

+1

私はHibernateの開発者ではなく、私はソースコードを調べました。 –

答えて

1

JBossのドキュメントから:

戸建 - 分離されたインスタンスは 、永続的となっているが、そのセッションが閉じられたオブジェクトです。もちろん、オブジェクトへの参照はまだ有効ですが、 が有効です。この状態では、デタッチされたインスタンスが に変更されることさえあります。デタッチされたインスタンスは、遅い時点で の新しいセッションに再接続することができ、それを(そしてすべての変更) を再び永続化します。この機能により、ユーザーの思考時間を必要とする実行単位の長いモデル が有効になります。私たちは、ユーザの という観点からは、アプリケーション取引(すなわち、作業単位)を と呼びます。

したがって、Hibernateは基本的にセッションと接続オブジェクトを追跡します。 永続性のためにそのセッションに関連付けられているオブジェクトはすべて切り離され、他のPOJOと同じようになります。

は、だから何Hibernateが行うことは次のとおりです。

  1. は、オブジェクト参照のsession.evict()またはセッションからオブジェクトを削除しsession.clear()呼び出します。
  2. Hibernates永続マネージャは、オブジェクトの状態を判断する識別子の存在に依存します。オブジェクトに識別子がある場合、オブジェクトは永続的です。セッションに属していない場合はDETACHEDです。
  3. デタッチされたオブジェクトは、新しいセッションが開かれた後に再関連付けしてデータベースと同期させることができます。独立オブジェクト参照にsession.update()又はsession.saveOrUpdate()を呼び出す
  4. バック永続状態分離オブジェクトを移行します。
  5. デタッチされたオブジェクトがに再接続された場合、はデータベースがオブジェクトの現在の状態で更新されます。分離された状態で行われた変更を含めることができます。

参考文献はhereです。

+0

@TimBiegeleisenええ、申し訳ありませんが、絶えず編集していました。今すぐ答えを更新しました。 –

関連する問題