我有一個NHibernate的問題,當我使用HQL或Linq(Session.Query)獲取某些內容時,沒有使用我的映射配置來加載集合。 Session.Get和Session.QueryOver正在按照預期工作。HQL和Session.Query忽略映射中定義的渴望提取
我使用的是NHibernate 3.2。以下是我的產品映射中集合的映射。
<bag name="OrderItems" inverse="true" cascade="none" lazy="false" fetch="join">
<key column="order_id" />
<one-to-many class="OrderItem" />
</bag>
和從另一側的映射如下所示:
<many-to-one name="Product" class="Product" column="product_id" not-null="true" />
我有4次試驗,2是全成和2則沒有。他們使用Session.SessionFactory.Statistics跟蹤CollectionFetchCount(在1個連接的查詢中或在單獨的查詢中選擇了OrderItems)。目的是在選擇產品時選擇並加載OrderItems,因爲OrderItems幾乎總是被訪問。
LastCreated是插入到數據庫中的最後一個產品的簡單參考。
[Test] /* Success */
public void Accessing_Collection_Using_Session_Get_Results_In_1_Select()
{
// Get by Id
var product = Session.Get<Product>(LastCreated.Id);
var count = product.OrderItems.Count;
Assert.AreEqual(0,statistics.CollectionFetchCount,"Product collectionfetchcount using Get");
}
[Test] /* Success */
public void Accessing_Collection_Using_Session_QueryOver_Results_In_1_Select()
{
// Get by Id
var product = Session.QueryOver<Product>().SingleOrDefault();
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using QueryOver");
}
[Test] /* Fail */
public void Accessing_Collection_Using_Session_Query_Results_In_1_Select()
{
// Get by IQueryable and Linq
var product = Session.Query<Product>().Single(x => x.Id == LastCreated.Id);
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using Linq");
}
[Test] /* Fail */
public void Accessing_Collection_Using_HQL_Results_In_1_Select()
{
// Get by IQueryable and Linq
var product = Session.CreateQuery("from Product where Id = :id")
.SetParameter("id",LastCreated.Id)
.UniqueResult<Product>();
var count = product.OrderItems.Count;
Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using HQL");
}
這是預期的行爲還是我做錯了什麼?
感謝您的回答!我有點糊塗,雖然作爲參考的NHibernate來自nhforge的HQL表示:「另外,」fetch「連接允許使用單個select來將關聯或值集合與其父對象一起初始化,這對於集合來說特別有用,它有效地覆蓋了外層對於關聯和集合,映射文件的加入和延遲聲明「對我而言,暗示它應該查看映射文件,或者文檔討論覆蓋的行爲是什麼? – ds99jove
如果映射沒有聲明任何渴望的提取, '用'join fetch'重寫它......這裏的doc文字有點誤導。 –