上篇主要講述了[hibernate的對象關系映射](http://blog.csdn.net/lovesummerforever/article/details/20901011)。本篇講述對象繼承關系是如何映射具體的表。
對于繼承類映射到表有三種方式:
1、一棵繼承樹映射一張表。
2、每個子類各自映射表。
3、繼承樹的每個類各自映射表。
### 1、一棵繼承樹一張表。
直接上圖,如下圖所示。

映射文件代碼如下所示。
~~~
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="string">
</discriminator>
<property name="name"/>
<property name="sex"/>
<subclass name="Pig" discriminator-value="P">
<property name="weight"/>
</subclass>
<subclass name="Bird" discriminator-value="B">
<property name="height"/>
</subclass>
</class>
</hibernate-mapping>
~~~
### 2、每個子類一張表。

映射文件代碼如下所示。
~~~
<!--加上package,所以不用寫完整了.-->
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" abstract="true">
<id name="id">
<generator class="assigned"/>
</id>
<property name="name"/>
<property name="sex"/>
<union-subclass name="Pig" table="t_pig">
<property name="weight"/>
</union-subclass>
<union-subclass name="Bird" table="t_bird">
<property name="height"/>
</union-subclass>
</class>
</hibernate-mapping>
~~~
### 3、每個類一張表(子類+父類)

代碼如下所示。
~~~
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal" lazy="false">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<property name="sex"/>
<joined-subclass name="Pig" table="t_pig">
<!-- 將會在pig表中加上一個pid -->
<key column="pid"/>
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<!-- 將會在pig表中加上一個pid -->
<key column="bid"/>
<property name="height"/>
</joined-subclass>
</class>
</hibernate-mapping>
~~~
以上三種策略,各有優缺點:
單表繼承。查詢速度最快,效率高,但是存在冗余字段。
類表繼承。層次清楚,無冗余;但是如果使用自增主鍵方式會產生重復主鍵。需要使用手動分配主鍵。
具體表繼承。層次最明了,這是優點,也是缺點,而且數據操作效率不高!
- 前言
- Struts旅程(一)Struts簡介和原理
- struts旅程(二)Struts登錄示例
- Struts旅程(三)Struts表單處理器ActionForm(靜態動態)
- Struts旅程(四)MVC向struts MVC框架演變過程
- Struts旅程(五)struts控制器DispatchAction
- Struts旅程(六)Struts頁面轉發控制ActionForward和ActionMapping
- Hibernate旅程(一)Hibernate架構概述
- Hibernate旅程(二)Hibernate實例
- Hibernate旅程(三)Hibernate持久化對象的三個狀態
- Hibernate旅程(四)Hibernate對數據庫刪除、查找、更新操作
- Hibernate旅程(五)Hibernate映射--基本類映射和對象關系映射
- Hibernate旅程(六)Hibernate映射--繼承映射
- Hibernate旅程(七)Hibernate緩存機制--一級緩存
- Hibernate旅程(八)Hibernate緩存機制--二級緩存
- Hibernate旅程(九)Hibernate緩存機制--查詢緩存
- Spring旅程(一)為什么使用Spring
- Spring旅程(二)非Spring向Spring過渡-- Spring IOC容器的使用
- Spring旅程(三) AOP--Spring AOP容器基礎
- Spring旅程(四) AOP--Spring AOP實例
- SSH旅程(五)Spring運用到Hibernate中
- SSH旅程(六)Spring和struts結合(方案一)