2011-10-11 117 views
0

我使用nhibernate2.1作爲spring.net 1.3的一部分。我有以下聲明作爲我的映射的一部分。我的理解是,除非調用getter,否則這個對象不應該加載。我在setter上設置了一個斷點,並將所有nhibernate SQL語句轉儲到記錄器。在我的部分測試中,我實際上在原始對象上創建了一個全新的子對象和一個全新的屬性(因此在名稱中爲「2」),所以我肯定屬性沒有被訪問到任何地方。儘管如此,只要我的父對象加載,我可以驗證此屬性已加載。所以......我在這裏錯過了什麼?Nhibernate延遲加載一組不工作

<set name="UserCustomer2" lazy="true"> 
    <key column="[FK_USERS]" /> 
    <one-to-many class="UserCustomer2" /> 
</set> 

@A:這裏是我的財產:

private ICollection<UserCustomer2> _UserCustomer2 = new HashSet<UserCustomer2>(); 
public virtual ICollection<UserCustomer2> UserCustomer2 
{ 
    get { return _UserCustomer2; } 
    set { this._UserCustomer2 = value; } 
} 

,這裏是我如何請求父對象:

IQuery query = dao.GetQuery("FROM UserImpl u WHERE u.UserName = :username AND u.Password = :password"); 
query.SetParameter("username", username); 
query.SetParameter("password", password); 
IList users = query.List(); 
+0

你如何驗證對象被加載?你確定你沒有加載測試代碼或調試器等嗎? – NOtherDev

+0

我看到在日誌中執行的SQL語句,並在setter上放置了一個斷點。當我執行時,會觸發斷點,當我將鼠標懸停在setter中的「value」上時,它是具有來自數據庫的正確數據的完全填充的對象。 – heath

+1

您能否展示如何查詢父對象的數據庫以及UserCustomer2屬性在父類中的外觀? – NOtherDev

回答

0

@dotjoe,你我走上了正確的道路。我測試了很多場景,並基於斷點和我已經確定設置斷點不會觸發延遲加載的記錄SQL語句。但是,當您將鼠標懸停在屬性上以在調試模式下對其進行檢查時,它實際上會保護對象。我想這種說法是有道理的,但是當我檢查對象時,我會看到一個代理對象,而不是完全水合的對象。我很驚訝調試模式的動作會觸發延遲加載 - 我認爲只會從實際的應用程序代碼觸發。另一件我很好奇的事情是,如果setter總是被調用,並且只是傳遞了一個代理對象,或者它只是被調用,那麼因爲我已經在setter中放置了一個斷點。我會假設前者,但到目前爲止,我的假設是錯誤的。如果任何人都能提供一些見解,我很好奇它是如何在幕後實際運作的。

+0

另一件要檢查的可能是刪除私人支持字段或通過訪問=「field.camelacse-underscore」告訴NH有關它。你擁有它的方式可能是與代理對象搞砸了嗎?只是一個猜測... – dotjoe