私は、さまざまな集合ルートのセットを持つリッチ オブジェクト モデルを持つプロジェクトに取り組んでいます。
Castleスタック (モノレールから ActiveRecord を使用した nHibernate まで) を使用しています。
集約ルートを遅延としてマークし[ActiveRecord(Lazy = true)]
、オブジェクト グラフを熱心にフェッチするために、リポジトリで「熱心な」ルーチンをカスタマイズしました。HQL を使用して、ルートの子コレクションから熱心なフェッチを定義します。
たとえば、集約ルート (および遅延ロードとマークされている)の場合、完全なグラフのエンティティをAccount
熱心にフェッチします。Account .. Order .. Product
したがって、これまでのところ驚くことはありません(うまくいけば)。
上記の例で、Product もマークされている場合[ActiveRecord(Lazy = true)]
、HQL の熱心なフェッチ ディレクティブが停止しているように見えます。
遅延ロードされた子オブジェクトの熱心なフェッチを強制する方法を知っている人はいますか??
乾杯イアン
更新:
ここに hql の例があります。以下の「me.yahoo.com/../1」の例を使用すると、IMuliQuery を使用して、多対多の関係をフェッチするときに N+1 の依存関係を解決しています。また、多対多のマッピング クラスを明示的に使用しています。その結果、本社は次のようになります。
from Account a 'm eager loading the graph
inner join fetch a.AccountsOrders ao
inner join fetch ao.Order
from Account a 'm eager loading the graph
inner join fetch a.AccountAddresses aa
inner join fetch aa.Address ad
where a.ID = ?
...これにより、2 つの sql ステートメントが実行され、必要な最小限の行セットが返されます。これを単一のオブジェクト グラフに解決できます。良い。
しかし...たとえば、Address
遅延ロードとマークされた(そしてOrder
そうではなかった)場合、アクセスOrder
はそれ以上のSQLステートメントをトリガーしませんAddress
が、どちらも熱心にロードされているにもかかわらず、アクセスは実行します。
Address
では、上記の遅延ロードされたエンティティが上記のステートメントによって熱心にフェッチされないのはなぜでしょうか?