Eagarly加载多对多的关系

时间:2011-08-08 02:04:05

标签: nhibernate hql nhibernate-criteria

我有一个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 );
}

1 个答案:

答案 0 :(得分:0)

我已经在stackoverflow的另一个答案中解释了difference between eager fetching and eager loading。据我所知,没有其他方法可以通过以某种方式访问​​它们或通过调用NHibernateUtil来加载集合。

最优雅的方式是在编写应用程序时,不需要显式加载任何集合和引用。延迟加载应该对业务逻辑透明。