NHibernate QueryOver with Fetch: 複数の SQL クエリとデータベース ヒットの説明
NHibernate の QueryOver を使用してエンティティを取得し、関連リストをフェッチしようとする場合構文を変更すると、開発者は多数の冗長な SQL クエリやデータベース ヒットに遭遇する可能性があります。この問題は、積極的フェッチが使用されている場合に発生します。
次のコードを考えてみましょう:
Session.QueryOver<UserRole>() .Fetch(x => x.UsersInRole).Eager .List();
このクエリでは、次のような一連のデータベース ヒットが発生します。
この動作は、NHibernate の熱心なフェッチ戦略に由来します。積極的フェッチが有効な場合、関連するコレクションが親エンティティとともに即座にロードされます。ただし、各関連オブジェクトには、取得する必要がある異なる関連付けがあり、その結果、追加のクエリが発生する可能性があります。
提供されたマッピング例では、UserRole エンティティと UsersInRole エンティティには多対多の関係があります。この関係で UserRoles を積極的にフェッチすると、セッションには、関連付けられた UsersInRole ではなく、取得された UserRole に関する情報のみが含まれます。
この問題を軽減するには、バッチ フェッチを使用する必要があります。コレクション マッピングで BatchSize プロパティを設定すると、NHibernate は、関連付けられたオブジェクトごとに個別のクエリを実行するのではなく、関連するエンティティをバッチで取得します。
解決策:
HasManyToMany(x => x.UsersInRole) ... .BatchSize(25)
両方のコレクション マップ (クラス マップを含む) にバッチ サイズを割り当てると、多数の冗長なクエリの代わりに複数のクエリが実行されるようになります。クエリの正確な数は、バッチ サイズとページ サイズの設定によって異なります。
以上がEager Fetching を使用した NHibernate QueryOver によって複数のデータベース クエリが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。