我有一棵树,每一个节点是资源类:NHibernate的一个一对多的关系,延迟加载的时候就已经加载
public abstract class Resource
{
public virtual Guid Id { get; set; }
public virtual Resource Parent { get; set; }
public virtual IList<Resource> ChildResources { get; set; }
}
,你可以看到这个类是抽象的,也有来自许多不同的派生类资源(目前3个,更多)。
在我的数据库中,我有一个资源表,以及 从Resource派生的每个类的表。这些映射在一起<joined-subclass>
。
我读过这样的:
和我有相同的代码Ayende加载我的树:
var resource = UnitOfWork.Current.Session
.CreateQuery("from Resource r join fetch r.ChildResources")
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.SetReadOnly(true)
.List<Resource>();
这是所有工作的罚款(所有的资源都可返回一个选择)但是,我看到额外的选择发生,因为我枚举资源的ChildResources列表。
就是因为这一点,?:
无论哪种方式,我该如何避免这种情况的发生?
这里的(修剪为清楚起见类名 )的关系的映射的一部分:
<bag cascade="save-update" fetch="join" lazy="false" inverse="true" name="ChildResources">
<key>
<column name="Parent_Id" />
</key>
<one-to-many class="Resource" />
</bag>
<many-to-one class="Resource" name="Parent">
<column name="Parent_Id" />
</many-to-one>
感谢
UPDATE
稍有疏忽,其仅发行额外的选择时枚举树中叶节点的子集合...
什么是你看到的选择? – Mark 2009-09-15 10:49:04
'joined-subclasses'的'left join'的第一个'select'返回所有资源。额外的选择是我期望在懒惰负载情况下看到的; '选择资源where parent_id = foo' – 2009-09-15 12:18:21
看到我的更新q – 2009-09-15 12:29:46