У меня есть две сущности, 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"/>
пожалуйста, дайте мне знать, если я неправильно понял это.спасибо.