2009-08-26 57 views
1

我正在做一些每表繼承和所有工作很好 - 但我注意到,當我想基本實體(基表數據)NHProf顯示左外部加入子實體/(相關表)如何避免每個表繼承使用NHibernate 2.1連接

如何設置默認行爲以僅查詢所需的數據 - 例如:當我想要一個父元素列表(並且只有那些數據)時,查詢只返回我那個元素。

現在我的映射類似於下面:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"> 
    <class name="FormBase, ClassLibrary1" table="tbl_FormBase"> 
    <id name="BaseID" column="ID" type="Int32" unsaved-value="0"> 
     <generator class="native" /> 
    </id> 
    <property name="ImportDate" column="ImportDate" type="datetime" not-null="false" /> 
    <joined-subclass table="tbl_Form" name="Form, ClassLibrary1"> 
     <key column="ID"/> 
     <property name="gendate" column="gendate" type="string" not-null="false" /> 
    </joined-subclass> 
    </class> 
</hibernate-mapping> 

和示例,我想所有的數據備份VS只有父實體如下所示:

Dim r As New FormRepository() 
    Dim forms As List(Of Form) = r.GetFormCollection().ToList() 



    Dim fbr As New FormBaseRepository() 
    Dim fb As List(Of FormBase) = fbr.GetFormBaseCollection().ToList() 

回答

2

你可以用」噸。它被稱爲「隱式多態性」,它是Hibernate提供的一個相當不錯的(儘管在你的情況下是不需要的:-))特性。查詢基礎對象列表時,實際返回的實例是實際的具體實現。因此,Hibernate需要左連接來查明特定的實體是FormBase還是Form。

更新(太大,不適合在評論): 這裏的一般問題是,如果你把Hibernate誘騙僅加載基礎機構最終可能會不一致的會話狀態。考慮以下幾點:

  1. Form實例(即堅持既form_baseform表)莫名其妙地被裝爲FormBase
  2. 您已將其刪除。
  3. 在沖洗休眠(它認爲我們正在處理FormBase,因此是幸福沒有意識到有兩個表涉及)發出一個DELETE FROM form語句,因爲FK違反拋出一個異常。

隱式多態的存在是爲了防止這種情況發生 - Form總是一個Form,從來沒有一個FormBase。當然,您可以使用「table-per-hierarchy」映射,其中的所有內容都位於同一個表中,因此不需要連接,但最終會有(可能)大量NULL列,並且 - 無法指定對兒童的財產不是無效的。

所有這一切說,如果這是真的你一個巨大的性能問題(這通常不應該是 - 想必這是一個索引的加入),你可以嘗試使用本機查詢只返回FormBase實例。

+0

啊...... - 有沒有另一種方法來解決這個繼承問題,如果我查詢該實體而不是孩子,將會保持我的基表獨立? (現在每個子元素都有自己的表) – 2009-08-26 19:36:49

+0

我已經更新了我的答案 - 太多東西以適應評論 – ChssPly76 2009-08-26 19:50:05

+0

嗯,我不認爲這是目前我的POC中的一個大問題,但是這個基類幾乎被繼承我的生產應用中有12個其他課程...所以我有點擔心(也許我不應該像你提到的那樣 - 每個都會​​被索引連接) – 2009-08-26 19:59:18