почему NHibernate FetchMode.Join не работает в этом сценарии? - PullRequest
1 голос
/ 17 декабря 2009

У меня есть две сущности, 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's mapping:)

<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)

, однако, используя FetchMode.Join для объекта C, выполняет запрос с левым внешним соединением, а затем немедленно выполняет еще N запросов, выбирая P по ID!(любезно предоставлено NHProf)

есть идеи, почему это происходит?


отвечая на вопрос @ KLE, вот выдержка из документации здесь

Для связи первичного ключа добавьте следующие сопоставления для Employee и Person соответственно:

<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 голосов
/ 12 апреля 2010

Не знаю, какую версию NHibernate вы используете, но с 2.1.0 - 2.1.2 у меня были некоторые проблемы, связанные с FetchModes и сложными сопоставлениями. Я не сталкивался с property-ref (что явно сбивает с толку свойства), но у меня были проблемы с некоторыми классами объединения.

Вы пробовали установить lazy="true" / "extra" и затем определить FetchMode.Join?

...