如何在hibernate中映射2个子类与1个父抽象类?

时间:2012-05-22 03:28:25

标签: java hibernate

我有一个有2个子类的抽象基类。每个子类都有一个映射到它的表,而基类没有。为了让我映射到Hibernate,我这样做:

在subclassA.hbm.xml

<class name="BaseClass" abstract="true">
  <id name="theid" type="string" column="THE_ID" lenght="15"/>

  <union-subclass name="SubClassA" table="TABLE_A">
     ...
  </union-subclass>
</class>

同样的事情发生在SubClassB

在subclassB.hbm.xml

<class name="BaseClass" abstract="true">
  <id name="theid" type="string" column="THE_ID" lenght="15"/>

  <union-subclass name="SubClassB" table="TABLE_B">
     ...
  </union-subclass>
</class>

id是BaseClass中的成员变量,TABLE_ATABLE_B中都有THE_ID字段。我收到运行时错误提及BaseClass重复映射

当我有两个子类时,我可以知道如何进行Hibernate映射吗?

2 个答案:

答案 0 :(得分:2)

SubClassB定义中定义BaseClass,以及SubClassA定义。

答案 1 :(得分:1)

如果您创建两个类,则可以使用两个映射文件:

public class SubClassA extends BaseClass {
}

public class SubClassB extends BaseClass {
}

类的主体可以是空的,也可以有额外的成员变量(它们只需要默认的无参数构造函数,如果不编写其他构造函数,则需要它们)。在hibernate映射中,您可以访问父类的成员变量(甚至是私有成员变量!)。

然后你只需编写两个映射文件subclassA.hbm.xml

<class name="SubClassA" >
   <id name="theid" type="string" column="THE_ID" lenght="15"/>
   ...
</class>

和subclassB.hbm.xml

<class name="SubClassB">
  <id name="theid" type="string" column="THE_ID" lenght="15"/>
  ...
</class>

P上。 S.在这种情况下,您必须映射BaseClass。如果超类和子类都被映射,Hibernate会感到困惑。