我有一个Category类型和一个Item类型,中间有双向的多对多关系。这种关系的双方都是懒惰的。我想在HQL或ICriteria中编写一个查询,它执行以下操作:给定类别的ID,加载所有项目(急切加载)这些项目的类别集合。这样的查询会是什么样的?
我得到了:
session.CreateQuery( "from Category c left join fetch c.Items where c.ID = :cid" )
.SetParameter( "cid", ofCategory.ID )
.List();
但是我无法弄清楚如何适应加速每个项目的类别集合的部分。
请注意,我已经使用NHibernateUtil.Initialize()工作了。然而,出于教育的缘故,我想尝试一种不同的方式 - 可能是一种更优雅的方式。因此,它目前正在首先在相关的Item和category实例上调用ISession.Lock(),然后:
foreach ( Item i in ofCategory.Items ) {
if ( !NHibernateUtil.IsInitialized(i.Categories) )
NHibernateUtil.Initialize( i.Categories );
}
答案 0 :(得分:0)
我已经在stackoverflow的另一个答案中解释了difference between eager fetching and eager loading。据我所知,没有其他方法可以通过以某种方式访问它们或通过调用NHibernateUtil
来加载集合。
最优雅的方式是在编写应用程序时,不需要显式加载任何集合和引用。延迟加载应该对业务逻辑透明。