NHibernate在已加载时延迟加载一对多关系
我有一个树,其中每个节点都是一个资源类:NHibernate在已加载时延迟加载一对多关系,nhibernate,hibernate,Nhibernate,Hibernate,我有一个树,其中每个节点都是一个资源类: public abstract class Resource { public virtual Guid Id { get; set; } public virtual Resource Parent { get; set; } public virtual IList<Resource> ChildResources { get; set; } } 公共抽象类资源 { 公共虚拟
public abstract class Resource
{
public virtual Guid Id { get; set; }
public virtual Resource Parent { get; set; }
public virtual IList<Resource> ChildResources { get; set; }
}
公共抽象类资源
{
公共虚拟Guid Id{get;set;}
公共虚拟资源父级{get;set;}
公共虚拟IList子资源{get;set;}
}
正如您所看到的,这个类是抽象的,并且有许多来自资源的不同派生类(目前是3个,后面还有更多)
在我的数据库中,我有一个用于资源的表,以及一个用于每个类的表
源于资源。它们与
一起映射
我读过:
我有与Ayende相同的代码来加载我的树:
var resource = UnitOfWork.Current.Session
.CreateQuery("from Resource r join fetch r.ChildResources")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.SetReadOnly(true)
.List<Resource>();
var resource=UnitOfWork.Current.Session
.CreateQuery(“从资源r加入获取r.ChildResources”)
.SetResultTransformer(新DistincTrotentyResultTransformer())
.SetReadOnly(真)
.List();
这一切都很正常(所有资源都通过一次选择返回),但是,我在枚举资源的ChildResources列表时看到额外的选择
是因为这个吗
不管怎样,我如何防止这种情况发生
下面是关系映射的一部分(类名
为清晰起见,进行了修剪):
谢谢
更新
稍有疏忽,仅在枚举树中叶节点的子集合时发出额外的选择…执行以下操作之一:
<bag ... lazy="false">
lazy=false没有区别,这就是我使用的HQL。当执行HQL时,我会从数据库返回所有资源行,很好:)但是。。。当我枚举ChildResources时,它再次命中数据库“从资源中选择,其中Parent_id=
我已经更新了问题以反映这一点,我还发现了其他一些问题。您看到的选择是什么?第一个select
带有左连接的连接子类的返回所有资源。额外的选择是我期望在延迟加载情况下看到的<代码>从父项id=foo的资源中选择
<bag ... lazy="false">
var resources = session.CreateQuery("from Resource r join fetch r.ChildResources");