为什么NHibernate FetchMode.Join不能在这种情况下工作?

时间:2009-12-17 08:31:24

标签: nhibernate nhibernate-mapping

我有两个实体,C和P. C以一对一的关联映射到P,lazy =“no-proxy”, 像这样:( P的映射:)

<one-to-one name="c" class="C" property-ref="P" access="field" lazy="no-proxy"/>

P以多对一关联映射到C,如下所示:(C的映射:)

<many-to-one name="p" column="PId" class="P" access="field" lazy="no-proxy" not-null="false"/>

通常我使用延迟抓取,但在某些情况下我使用FetchMode.Join来避免N + 1 SELECTs问题,如下所示:

criteria.SetFetchMode("p", FetchMode.Join)

但是,对于C实体使用FetchMode.Join执行带有左外连接的查询,然后立即执行N次查询,按ID获取P! (描述NHProf礼貌)

知道为什么会这样吗?


回答@KLE的问题,这里摘自文档here

  

对于主键关联,请添加   以下映射到Employee和   人分别:

<one-to-one name="person" class="Person"/>
<one-to-one name="employee" class="Employee" constrained="true"/>
  

确保PERSON和EMPLOYEE表中相关行的主键相等。    或者,带有一个外键   唯一约束,从员工到   人,可以表示为:

<many-to-one name="person" class="Person" column="PERSON_ID" > unique="true"/>
  

可以进行此关联   双向添加以下内容   到人物映射:

<one-to-one name="employee" class="Employee" property-ref="person"/>
如果我误解了这个,请告诉我。感谢。

1 个答案:

答案 0 :(得分:0)

不知道你使用的是哪个版本的NHibernate但是2.1.0 - 2.1.2我有一些关于FetchModes和复杂映射的问题。我没有碰到property-ref(显然混淆了属性步行者)但我确实遇到了一些联盟类的问题。

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