2009-12-17 107 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

相關問題