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),来保 存超类的实例。