hibernate 承袭映射

hibernate 继承映射

一.    继承有三种策略
1.    每个分层结构一张表
例子:
<class name=”Person” table=”

t_person”>
    <id name=”id” type=”

long” column=”person_id”>
<generator class=”native”

></generator>
</id>
<decriminator column=”person_type

” type=”string”/>
<property name=”name” coloum=”

person_name”></property>
….
<subclass name=”Student”

discriminator-value=”student”>
    <property …>….</property>
</subclass>
<subclass name=”Teacher”

descriminator-value=”teacher”>
        <property …

>….</property>
</subclass>
</class>
只生成一张表通过字段Person_type区别不

同的子类
2.    每个子类一张表
<class name=”Person” table=”

t_person”>
    <id name=”id” type=”

long” column=”person_id”>
<generator class=”native”

></generator>
</id>
<property name=”name” coloum=”

person_name”></property>
….
<joined-subclass name=”Student”

table=”t_student”>
    <key column=”person_id”

></key>
    <property …>….</property>
</joined-subclass>
<joined-subclass name=”Teacher”

table=”t_teacher” >
    <key column=”person_id”

></key>
        <property …

>….</property>
</joined-subclass>
</class>
生成三张表,三个子类通过主键关联到超类



4.每个具体类一张表
<class name=”Person”>
    <id name=”id” type=”

long” column=”person_id”>
<generator class=”native”

></generator>
</id>
<property name=”name” coloum=”

person_name”></property>
….
<union-subclass name=”Student”

table=”t_student”>
<property …>….</property>
</union-subclass>
<union-subclass name=”Teacher”

table=”t_teacher” >
        <property …

>….</property>
</union-subclass>
</class>
这里涉及三张与子类相关的表。每张表为对

应类的所有属性(包括从超类 继承的属性

)定义相应字段。
这种方式的局限在于, 如果一个属性在超

类中做了映射,其字段名必须与所有子类表

中定义的相同。(我们可能会在 Hibernate

的后续发布版本中放宽此限制。)不允许在

联合子类(union subclass)的继承层次中

使用标识生成器策略(identity generator

strategy),实际上,主键的种子

(primary key seed)不得不为同一继承层

次中的全部被联合子类所共用。
假若超类是抽象类,请使用

abstract="true"。 当然,假若它不是抽象

的,需要一个额外的表(上面的例子中,默

认是 Person),来保 存超类的实例。