我有兩個實體,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