每个层次结构的Hibernate表如何

时间:2009-06-05 21:56:47

标签: hibernate inheritance

我想使用hibernate来包含对象的层次结构,但是discriminator列是另一个包含定义子类类型的CODE的表的外键。

是否可以将连接表中的代码指定为鉴别器,还是必须使用键值并希望键保持一致?

e.g。 discriminator =“square | circle”vs.s.鉴别= “0 | 1”

table:shape

area=25   shape_type_fk=0
area=10   shape_type_fk=1

table:shape_types

ID CODE
0  square
1  circle 

2 个答案:

答案 0 :(得分:1)

快速测试表明你可以这样做:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">

  <class name="Shape" abstract="true">
    <id name="id"/>
    <discriminator formula="select CODE from SHAPE_TYPES st where st.ID=SHAPE_TYPE"/>
    <version name="version"/>

    <subclass name="Square" discriminator-value="square"/>
    <subclass name="Circle" discriminator-value="circle"/>

  </class>
</hibernate-mapping>

现在,此映射不会创建公式中引用的SHARE_TYPE表,也不会将SHAPE_TYPE列添加到SHAPE表中。这可以在Hibernate从类路径中自动读取的import.sql文件中,或者通过将另一个类映射到该表来完成。

答案 1 :(得分:-1)

看起来您需要使用join-subclass而不是子类。详细信息为here