我有两个实体,C和P. C被映射至P以一对一的关联,与懒惰=“无代理”, 是这样的:(P的映射:)为什么NHibernate FetchMode.Join在这种情况下工作?
<one-to-one name="c" class="C" property-ref="P" access="field" lazy="no-proxy"/>
P被映射到下在多到一个关联,如下所示:(C的映射:)
<many-to-one name="p" column="PId" class="P" access="field" lazy="no-proxy" not-null="false"/>
通常我使用延迟抓取,但在某些情况下,我使用FetchMode.Join避免N + 1选择问题,如下所示:
criteria.SetFetchMode("p", FetchMode.Join)
但是,使用FetchMode.Join为C实体执行具有左外连接的查询,然后立即执行N多个查询,通过ID获取P! (分析由NHProf提供)
任何想法为什么发生这种情况?
回答@ KLE的问题,以下是从文档here
对于主键关联的摘录,添加 对下面的员工和 人分别为:
<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
确保p PERSON和EMPLOYEE表中相关行的rimary键是相等的。 另外,具有 唯一约束 人外键,从员工,可表示为:
<many-to-one name="person" class="Person" column="PERSON_ID" > unique="true"/>
这种关联可以制成 双向通过将以下 到Person的映射:
<one-to-one name="employee" class="Employee" property-ref="person"/>
请让我知道如果我误解次是。谢谢。
感谢您的编辑。我删除了我的答案,因为它没有带来任何... – KLE 2009-12-18 08:25:40