2013-06-24 113 views
0

假設我們有具有B類對象列表的類A(List<B>listOfBs)。在數據庫設計中,這意味着代表類B的表應該有一個引用代表類A的表的行的外鍵。現在,類B是類C,D和E的超類。 我的類A的hibernate映射文件如下並且工作正常儲存A類條目的數據庫,並在同一時間級聯包含在A級根據單個記錄的類別將單個表映射到各個表

類Hibernate映射文件的列表B類的多個條目:

<hibernate-mapping package="..."> 
    <class name="A" table="table_of_A"> 
     <id name="key" column="A_ID"> 
      <generator class="native"/> 
     </id> 
     <property name="...." type="long"/> 
     <property name="...." type="string"/> 
     <list name="listOfBs" access="field" cascade="all"> 
       <key column="A_ID" not-null="true" /> 
       <list-index column="idx"/> 
       <one-to-many class="B"/> 
     </list> 
    </class> 
</hibernate-mapping> 

我想弄清楚什麼,我應該包括上面顯示的休眠文件,所以我可以存儲在數據庫中的listOfBs可能包含C,D和E類的對象,因此listOfBs上的每個對象都應該轉到數據庫中的相應表。 請注意,我在隱式多態策略中使用每個具體類的表來映射hibernate上的繼承。

任何幫助將非常感激。提前致謝。

+0

我對以下鏈接做了更詳細的描述:[詳細說明鏈接](http://stackoverflow.com/questions/17325742/hibernate-mapping-with-one-to -many-polymorphic-relationship) – Soc

回答

0

所以,在這裏你使用的是每個具體類的表,並且作爲一個超類的B可以使用hibernate提供的泛化功能。

在休眠中有三種不同的方式可以表示繼承。

1.每類層次結構表

2.每個子類表

3.每個具體類

表由於您使用table per concrete類,你將需要改變按照以下的等級B映射

<class name="B"> 
<id name="id" column="ID"> 
    <generator class="sequence"/> 
</id> 
<property name="name" column="NAME"/> 
<union-subclass name="C" table="C"> 
    <property name="${properties}" column="collumns"/> 
</union-subclass> 
<union-subclass name="D" table="D"> 
    <property name="${properties}" column="collumns"/> 
</union-subclass> 
<union-subclass name="E" table="E"> 
    <property name="${properties}" column="collumns"/> 
</union-subclass> 
</class> 

This是參考鏈接,

+0

我也試過自己,''generator class =「sequence」>'給了我「org.hibernate.exception.SQLGrammarException:無法獲得下一個序列值」的錯誤。我實際使用'<發生器類= 「序列」> \t \t \t \t B_id_seq \t \t \t'。如果有幫助,我正在使用HSQL DB。 – Soc

+0

嘗試使用「原生」或「增量」。 – Kartik73

+0

'本地'不適用於'union-subclass'。遞增給我'org.hibernate.exception.SQLGrammarException:無法獲取增量生成器的初始值。 – Soc

相關問題