心得10-hibernate 高级映射之继承映射
1.对象模型(Java类结构)
一个类继承体系一张表(subclass)(映射文件)
<class name="Employee" table="employee" discriminator-value="0">
<id name="id">
<generator class="native"/>
</id>
<!—鉴别器,用来标识雇员具体是哪个类型;需要注意的是鉴别器的位置是固定,不能乱放,只能放置在id后其他属性前-->
<discriminator column="type" type="int"/>
<property name="name"/>
<subclass name="Skiller" discriminator-value="1">
<property name=”skill”/>
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell"/>
</subclass>
</class>
3. 每个子类一张表(joined-subclass) (表结构)
每个子类一张表(joined-subclass) (映射文件)
<class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<joined-subclass name="Skiller" table="skiller">
<key column="employee_id"/>
<property name="skill"/>
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="employee_id"/>
<property name="sell"/>
</joined-subclass>
</class>
4.混合使用“一个类继承体系一张表”和“每个子类一张表” (表结构)
![](http://img-my.csdn.net/uploads/201212/25/1356429420_5038.png)
混合使用“一个类继承体系一张表”和“每个子类一张表” (映射文件)
<class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type"/>
<property name="name"/>
<subclass name="Skiller">
<property name="net"/>
</subclass>
<subclass name=”Sales”>
<join table="sales">
<key column="employee_id"/>
<property name="sell"/>
</join>
</subclass>
</class>
5.每个具体类一张表(union-subclass) (表结构)
每个具体类一张表(union-subclass) (映射文件)
<class name="Employee" abstract="true">
<id name="id">
<generator class="hilo"/>
</id>
<property name="name"/>
<union-subclass name="Skiller" table="skiller">
<property name="skill"/>
</union-subclass>
<union-subclass name="Sales" table="sales">
<property name="sell"/>
</union-subclass>
</class>
主健不能是identity类型,如果父类是abstract=”true”就不会有表与之对应。
隐式多态,映射文件没有联系,限制比较多很少使用。
6. 以上情况的优缺点
继承关系:
1).整个继承关系一张表:子类的属性比较少的情况。要使用多态查询时。优点:只有一张表,查找快,查询效率高些;运用多态理念,符合java核心技术。缺点:如果增加子类表结构会被修改,操作麻烦;如果子类特别多,不同子类的不同字段也特别多,那么这张表里会出现很多空值null。
2).每个子类一张表:子类的属性较多时。优点:数据库中不存在无用的字段,即不存在空值。
3).每个具体类一张表:当父类是抽象类。不需要多态查询时。缺点:查找的时候先合并所有表然后在查找,比较慢,效率低。