2009-10-09 32 views
1

我看了一些關於後取=加盟 - http://nhforge.org/blogs/nhibernate/archive/2009/04/09/nhibernate-mapping-lt-many-to-one-gt.aspx(ser4ik.livejournal.com/2505.html) 所以我有一些問題,Forexample我有類取=加入到表一類NHibernate的

<class name="AttributesInf" table="attr_inf">  
<id name="Id"> 
    <generator class="identity"/> 
</id> 
<property name="Name" /> 
    <property name="Desc"/> 
</class> 

<class name="AttributeValue" table="attr_val">  
<id name="Id"> 
    <generator class="identity"/> 
</id> 
<property name="Value" /> 
<many-to-one name="AttrName" column="attrId"/> 
</class> 

如果我用這個映射而不集讀取= 「加入」 我得到的SQL:

Select av.Id, av.Value, av.attrId From attr_val av where av.Id=...() 

,並像當年獨立的SQL查詢後:

Select * From attr_inf where Id = av.attrId 

所以我的結果是:

class AttrinuteInf 
{ 
int Id; 
string Name; 
string Desc; 
} 
class AttributeValue 
{ 
int Id; 
string Value; 
AttributeInf AttrName; 
} 

如果我設置取= 「加入」 然後我得到一個查詢:

Select u.Id, u.UserName, u.BlogId, b.Id, b.BlogName, b.BlogAuthor, b.BlogMsg 
from Users u 
Left outer join Blogs b 
On u.BlogId=b.Id 
Where u.Id = ... 

所以我期望得到一個分類:

class AttributeValue 
{ 
int Id; 
string Value; 
string Name; 
string Desc; 
} 

但是我有同樣的結果,如果我沒有設置提取「加入」。

這樣好嗎? 有沒有辦法直接從類maped獲得屬性爲<many-to-one>? (而不是AttrName.Name,只是名稱)

說明:映射

部分上面設置不顯示我的真正的問題。 我想映射一些實體爲IDictionary<string,AttributeValue>。 我把它映射爲

<map name="Attributes" table="attr_val" lazy="true" cascade="all-delete-orphan" inverse="true"> 
<key column="item_id"></key> 
<index column="name"></index> //I don't have that item in class AttributeValue, that is why I try to get it from other table 
<one-to-many class="AttributeValue"/> 
</map> 

回答

7

這不是做你認爲它在做什麼。使用fetch = join只是在那裏熱切加載關係的許多方面。在這兩種情況下,最終都會返回相同的對象。默認情況下NHibernate會延遲加載相關的實體(這就是爲什麼你會得到第二個查詢)。通過使用fetch = join,您可以一次請求整個對象關係,但它仍然會像沒有fetch = join一樣填充對象。

1

這不是你描述它的方式。您的實體不會根據您的要求進行更改。

您將獲得主實體的實例列表,並與正在提取的其他實體關聯。因此,如果在您的代碼中訪問關聯,您會發現這些值。

如果您沒有獲取它,您將無法訪問這些字段,因爲它們不會從數據庫中檢索到。

+0

我明白了,謝謝。但那我能做什麼? – Kate 2009-10-09 12:28:22

+0

我知道你的映射對於常規的Hibernate是不正確的,我不確定NHibernate。我沒有看到你的聯繫...對不起,我現在沒有一個測試環境來幫助你:-( – KLE 2009-10-09 12:51:05

1

我不明白你的問題。 'fetch-join'屬性只是定義了NHibernate生成的用於檢索類的實例的SQL應該如何。 它與'將會返回什麼'無關。 NHibernate會將記錄集(即查詢的結果)轉換爲正確的類實例。

如果您只想檢索實體的某些部分(例如名稱),那麼您必須編寫HQL查詢或使用ICriteria API並使用投影。

+0

你在哪裏提供使用HQL?在映射? 我只想修復這個項目通過映射,這就是ICriteria API和預測不適合的原因。 – Kate 2009-10-09 12:26:01

+0

然後,您將不得不創建新類,其中只包含您感興趣的屬性,並將此類映射到表中。但是,我不會推薦這種方法。爲什麼使用hql或icriteria不是一個選項? – 2009-10-09 12:38:20

+0

我編輯上面的帖子來解釋。 – Kate 2009-10-09 13:10:30