企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
上篇主要讲述了[hibernate的对象关系映射](http://blog.csdn.net/lovesummerforever/article/details/20901011)。本篇讲述对象继承关系是如何映射具体的表。 对于继承类映射到表有三种方式: 1、一棵继承树映射一张表。 2、每个子类各自映射表。 3、继承树的每个类各自映射表。 ### 1、一棵继承树一张表。 直接上图,如下图所示。 ![](https://box.kancloud.cn/2016-06-21_576908bd3c71f.jpg) 映射文件代码如下所示。 ~~~ <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、每个子类一张表。 ![](https://box.kancloud.cn/2016-06-21_576908f94d034.jpg) 映射文件代码如下所示。 ~~~ <!--加上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、每个类一张表(子类+父类) ![](https://box.kancloud.cn/2016-06-21_576908f9661c0.jpg) 代码如下所示。 ~~~ <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> ~~~ 以上三种策略,各有优缺点: 单表继承。查询速度最快,效率高,但是存在冗余字段。 类表继承。层次清楚,无冗余;但是如果使用自增主键方式会产生重复主键。需要使用手动分配主键。 具体表继承。层次最明了,这是优点,也是缺点,而且数据操作效率不高!