2010-12-22 45 views
4

オープンセッション中に関連オブジェクトを遅延ロードできますが、セッション終了後も関連オブジェクトを使用できるかどうかを確認します。Hibernate Lazy Loading - セッションが終了した後

たとえば、USERクラスと関連するROLEクラスがあります。 USERをロードすると、関連するROLEオブジェクトも遅延ロードされます。セッションが閉じられた後、USERクラスとROLEクラスを完全にロードして使用可能にすることはできますか?

この機能は使用できますか?

答えて

8

短い回答:いいえ。セッションを終了する前に、セッションを閉じる前に必要なものを初期化する必要があります。遅延プロキシを強制的にロードするために使用する方法(列挙せずに)は、NHibernateUtil.Initialize(USER.ROLES)です。

ロングアンサー...種類の。新しいセッションにオブジェクトを「再接続」することができ、PersistentBagsや他のNHプロキシを初期化することができます。 DBには存在するが、新しいセッションではないオブジェクトがあり、まだ変更していないことがわかっているので、使用する最善の方法はSession.Lock(USER, LockMode.None)です。これは、オブジェクトの読み込みや書き込みに関する何かをNHibernateに知らせずに、オブジェクトを新しいセッションに関連付けます。

ただし、これはコードの匂いであることにご注意ください。新しいセッションにオブジェクトを定期的に再接続している場合は、セッションを十分に開いた状態にしていないという兆候です。たとえば、フォームごとに1つのセッションを開いたり、フォームが開いている間は開いたままにしておくことは問題ありません。ウィンドウが閉じたときに閉じることができます。

0

あなたが1-1の関係(ユーザーあたり0-1ロール)を扱っているなら、おそらく最も単純なオプションは遅延読み込みではなくeagerフェッチのために設定することです。レイジーローディングは、実際には、親戚、または特に大規模でほとんど必要のないものに向けられています。 NHは、そのようなシナリオで熱心なデータをすばやく含めるために、クエリを最適化するという非常に上手い仕事をしています。

0

はい。セッションが閉じられると、遅延ロードされたオブジェクトはメモリに残り、問題なくアクセスできます。

関連する問題