2011-08-08 8 views
0

私はカテゴリ型とアイテム型を持ち、その間に双方向の多対多関係があります。この関係の両側は怠惰です。私は、次のことを行うHQLまたはICriteriaのどちらかのクエリを書いてみたい:カテゴリのIDを与えられたら、それらのアイテムのカテゴリコレクションと一緒にすべてのアイテムをロードする。そのようなクエリはどのように見えますか?Eagarly多対多関係をロードしています

私は限りました:

session.CreateQuery("from Category c left join fetch c.Items where c.ID = :cid") 
     .SetParameter("cid", ofCategory.ID) 
     .List(); 

しかし、私は熱心に各項目のカテゴリーコレクションをロードする部分に収まるようにする方法を見つけ出すことはできません。

NHibernateUtil.Initialize()を使用して既に動作していることに注意してください。しかし教育のために、私は別のやり方を試してみたいと思います。それはもっとエレガントです。だから、現在、その後、最初の関連アイテムおよびカテゴリインスタンスにISession.Lock()を呼び出すことによって、働いている:

foreach (Item i in ofCategory.Items) { 
if (!NHibernateUtil.IsInitialized(i.Categories)) 
    NHibernateUtil.Initialize(i.Categories); 
} 

答えて

0

私はすでにstackoverflowの上の別の答えにdifference between eager fetching and eager loadingを説明しました。私が知る限り、何らかの方法でアクセスしたり、NHibernateUtilに電話をかけたりすることで、コレクションをロードする方法は他にありません。

最もエレガントな方法は、コレクションと参照を明示的に読み込む必要のないアプリケーションを書くときです。レイジーローディングは、ビジネスロジックに対して透過的でなければなりません。