2009-12-17 114 views
1

我有两个实体,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"/> 

请让我知道如果我误解次是。谢谢。

+0

感谢您的编辑。我删除了我的答案,因为它没有带来任何... – KLE 2009-12-18 08:25:40

回答

0

不知道你使用的是哪个版本的NHibernate,但是2.1.0 - 2.1.2我有一些关于FetchModes和复杂映射的问题。我没有遇到property-ref(这显然混淆了财产漫步者),但我确实遇到过一些工会类的问题。

您是否尝试过设置lazy="true"/"extra"然后定义FetchMode.Join

相关问题