10

nHibernate での子レコードの自動読み込みを無効にする方法があるかどうかを知りたい (1:多関係の場合)。

プロパティの遅延読み込みを簡単にオフにすることができますが、私が望むのは、あらゆる種類の自動読み込み (遅延と非遅延の両方) を無効にすることです。クエリを介してのみデータをロードしたい (すなわち HQL または Criteria )

マッピング ファイルで親子レコード間の関係を定義して、HQL を容易にし、親子エンティティを結合できるようにしたいのですが、親レコードはそれを明示的に述べています(熱心なフェッチなどを介して)。

例: データベースからの部門レコードのフェッチでは、データベースからすべての従業員レコードをフェッチする必要はありません。

ここでのオプションの 1 つは、Department の Employees コレクションを遅延ロードとして設定することです。このアプローチの問題点は、オブジェクトが呼び出し元の API に渡されると、遅延読み込みプロパティに「触れる」ことができ、データベースからリスト全体をフェッチすることです。

「エビクト」を使用してオブジェクトを切断しようとしましたが、常に機能しているようには見えず、オブジェクトに対して深いエビクトを実行しません。さらに、リフレクションを介してオブジェクトを操作しようとしているコードで後で大混乱を引き起こすプロキシ クラスを使用して、遅延ロードされたプロパティ タイプを抽象化し、オブジェクトで未使用のタイプに遭遇します。

私は nHibernate の初心者です。ポインタやヘルプは非常に役立ちます。

4

2 に答える 2

3

あなたの要求を考えると、部門から従業員にマップすることも、部門に従業員のプロパティを持たせることもできません。これは、データベースの従業員を見つけるために常にデータベースにヒットする必要があることを意味します。

これらのコード例がすぐに機能しない場合はお詫びします。現時点ではコンパイラの近くにいません。

したがって、部門クラスは次のようになります。

 public class Department 
 { 
     public int Id { get; protected set; }
     public string Name { get; set; }
     /* Equality and GetHashCode here */
 }

従業員は次のようになります。

 public class Employee
 { 
     public int Id { get; protected set; }
     public Name Name { get; set; }
     public Department Department { get; set; }
     /* Equality and GetHashCode here */
 }

部門の従業員を見つけたいときはいつでも、次のように電話する必要があります。

/*...*/
session.CreateCriteria(typeof(Employee))
    .Add(Restrictions.Eq("Department", department)
    .List<Employee>();

仕様に「部門には多くの従業員がいる」と記載されているからといって、それを双方向の関連付けとしてマッピングする必要があるわけではありません。関連する単方向性を保つことができれば、データ アクセスもスムーズに行うことができます。

Google "Domain Driven Design" Aggregate、またはドメイン駆動設計に関する Eric Evan の本の 125 ページを参照してください。

于 2008-10-23T13:24:55.683 に答える
-1

コレクションに lazy 属性を設定できます。あなたの例では、部門にはn人の従業員がいます.lazyが有効になっている場合、部門をロードするときに従業員はデフォルトでロードされません: http://www.nhforge.org/doc/nh/en/#collections-lazy

部門と従業員を一緒に明示的にロードするクエリを使用できます。これは「フェッチ」オプションです: http://www.nhforge.org/doc/nh/en/#performance-fetching-lazy

于 2008-10-20T08:52:50.430 に答える