0

我有一个 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 和类别实例上调用 ISession.Lock() 来工作,然后:

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

1 回答 1

0

我已经在 stackoverflow 的另一个答案中解释了急切获取和急切加载之间的区别。据我所知,没有其他方法可以加载集合,然后以某种方式访问​​它们或调用NHibernateUtil.

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

于 2011-08-08T13:45:05.367 回答