1

私はこの答えを白黒で見つけるために読んで周りを見回してきました。

Customerおなじみの問題について話しましょう Order。100個の注文をロードし、各注文が1人の顧客にのみリンクされているとします。

Fluent NHibernateを使用References()して、をリンクOrderするために使用し、およびCustomerを定義します。Not.LazyLoad()Fetch.Join()

今私は仮説的に考えています。NHibernateはこれらの2つのテーブルを単純に結合でき、エンティティを水和するのは非常に簡単です。ただし、私のテストでは、常にN + 1クエリ(実際には一意のIDのみ)が表示されます。コードとテーブルを共有することはできますが、退屈する可能性があります。

  • Order-> Customer(one->oneまたはMany->One)のN + 1を克服することは可能ですか?または、バッチ処理またはCriteria APIを使用する必要がありますか?
  • 可能であれば、流暢なNHibernateの例を教えていただけますか?
4

4 に答える 4

2

こんにちは
あなたがあなたの問題に取り組むことができる2つの方法があります

a)基準クエリの使用次のようになります

Session.CreateQuery(typeof(Order))
.Add(<Restrictions if any>)
.SetFetchMode("Customer",FetchMode.Eager)
.List<Order>();

b)HQLの使用

Session.CreateQuery("select o from Order inner join fetch o.Customer where <conditionifany>").List<Order>();

お役に立てれば..

于 2011-03-19T09:12:10.860 に答える
2

fetch="join" が機能しないという苦情がよくあります。これは、HQL で考慮されていないためです。HQL 内で宣言できます。

パフォーマンスを向上させるために fetch="join" を使用していましたが、多くの場合使用をやめました。問題は、多くのテーブルに結合すると、SQL サーバーが最大列数の制限に達する可能性があることでした。場合によっては、データがまったく必要ないため、マッピング ファイルでグローバルに指定することはあまり役に立ちません。

だから私はお勧めします

  • データが実際に使用されているかどうかがわかるため、HQL で明示的な結合フェッチを使用します。
  • または、その他の場合、バッチは透過的 (コードが知る必要がない) であるため、優れたソリューションであり、遅延読み込みを利用し、同時に N+1 問題を軽減します。
于 2011-03-18T14:03:22.990 に答える
2

あなたが行っている実際のクエリほどマッピングを見ていません。デフォルトではすべてのマッピングを LazyLoad のままにし、必要に応じてオーバーライドします。

Criteria API を使用してクエリを実行し、CreateAlias を使用して必要に応じて他のテーブルを結合します。このような状況を見つけて排除するには、NHProf を強くお勧めします。

于 2011-03-18T13:29:12.597 に答える
0

どのクエリAPIを使用していますか?

HQLの場合はjoin fetch、関連付けを熱心に取得するために使用できます。

LINQとQueryOverの場合は、.Fetch()

于 2011-03-19T21:05:07.427 に答える