簡體   English   中英

NHibernate總是保濕多對一

[英]NHibernate always hydrates many-to-one

使用NHibernate時出現奇怪的事情。 我已經打開了一個我沒有寫的代碼庫,而那個代碼庫已經不在了。 因此,我想我所尋找的是關於調試的更多技巧。

我正在使用NHIbernate 3.4 Linq提供程序來查詢與另一個實體具有多對一關系的實體。

我看到的是,即使我從未訪問過代表始終保持水合的多對一關系的屬性。 通過NHibernate Profiler查看查詢,我可以看到該屬性似乎是延遲加載的。 用調試器設置斷點,我可以看到該屬性從未被訪問過。

使用NHibernate Profiler時,我可以看到它在加載父實體列表時發生,但不在同一查詢中。

我不知道為什么會這樣,但是會導致N + 1問題。

實體在hbm.xml文件中定義。

因此,我要輸入的是我應該開始挖掘的地方。 我覺得我已經嘗試了所有我能想到的東西。

我幾乎可以肯定地說,問題不在NHibernate上,而是在使用方面(我們都同意我會說)

因此,我們應該(隱式或顯式)作為起點是惰性設置:

// class level
// by default lazy is turned on
<class name="Entity" ... lazy="true" ... >
   ...

// reference many-to-one level, also by default lazy
<many-to-one name="Entity" lazy="proxy" ... />

為了避免N + 1,我們應該確保我們使用具有batch-size設置的批量提取, 請參見此處

// class/entity level
// ATTENTION - this is not implicit, we have to define that
<class name="Entity" ... lazy="true" ... batch-size="25" >
  ...

// collection level
// ATTENTION - this is not implicit, we have to define that
<bag name="Entities" ... batch-size="25">
...

有了這些,現在NHibernate本身將永遠不會加載超過所需的負載。 那么,當需要加載參考時,可能是典型的用例?

覆蓋時:

public override bool Equals(object obj)
{
}
public override int GetHashCode()
{
}

這些方法應該被覆蓋(somtimes-對於Composite-id,甚至必須被覆蓋),以提供業務唯一密鑰。 檢查是否沒有任何參考值用於這種比較(例如,Country和Office的組合對於某些OtherEntity是唯一的)

最后但並非最不重要的一點是,調試器可能存在問題。 實際上,調試器會影響加載,因為每當在調試窗口中觀察到任何內容時,我們都會強制NHibernate加載惰性內容。

令人驚訝的是,這是“強制”加載的最常見來源。 所以,請清除您的觀察者...

最后建議-創建單元測試以僅加載根實體。 最后清除會話。 (使用事件探查器)觀察是否有數據庫命中。 您可以更輕松地檢查原因是什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM