2013-06-24 64 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

相关问题