1.subclass 继承映射
可实现父类,子类共用一张表,需在该表内增加一列辨别者列
以 Person——Student为例,Student继承Person,并多出 school 属性
映射文件 person.hbm.xml
<hibernate-mapping package="com.atguigu.hibernate.subclass">
<class name="Person" table="PERSONS" discriminator-value="PERSON">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<!-- 配置辨别者列 -->
<discriminator column="TYPE" type="string"></discriminator>
<property name="name" type="java.lang.String">
<column name="NAME" />
</property>
<property name="age" type="int">
<column name="AGE" />
</property>
<!-- 映射子类 Student, 使用 subclass 进行映射 -->
<subclass name="Student" discriminator-value="STUDENT">
<property name="school" type="string" column="SCHOOL"></property>
</subclass>
</class>
</hibernate-mapping>
Person,Student 对象都放在 PERSONS表中
PERSONS表中存在 ID,TYPE,NAME,AGE,SCHOOL 五个字段。
TYPE列为辨别者列,Student对象的Type列值为 STUDENT , Person类的对象Type列值为 PERSON (discriminator-value="PERSON"设置)
Person类的对象 SCHOOL列的值为null
注意:
(1)插入操作
辨别者列由hibernate自动维护
(2)查询操作
查询父类记录,只需要查询一张数据表
查询子类记录也只需要查询一张表(自动加上where语句)
缺点:
1.使用了辨别者列
2.子类独有的字段不能添加非空约束
3.若继承的层次比较深,则数据表的字段也会比较多
2.joined-subclass继承映射
可实现每个子类一张表
person.hbm.xml
<hibernate-mapping package="com.atguigu.hibernate.joined.subclass">
<class table="PERSONS" name="Person">
<id name="id" type="java.lang.Integer">
<column name="ID"/>
<generator class="native"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME"/>
</property>
<property name="age" type="int">
<column name="AGE"/>
</property>
<joined-subclass table="STUDENTS" name="Student"> <!-- 子类的表、类名(包名在package中)-->
<key column="STUDENT_id"/> <!-- 子类主键列名(外键连接,)-->
<property name="school" type="string" column="SCHOOL"/> <!-- 子类多出的属性-->
</joined-subclass>
</class>
</hibernate-mapping>
PERSONS表中字段:ID,NAME,AGE
STUDENTS表中字段:STUDENT_id,SCHOOL
插入Student类的对象时,既要插入PERSONS表,又要插入STUDENTS表
注意:插入操作
插入子类需插入两张表
查询
父类:做一个左外连接查询
子类:做一个内连接查询
优点:
不需要使用辨别者列
子类独有的列可以添加非空约束
没有冗余字段
缺点:
效率低
3.union-subclass进行继承映射
将每个实体类对象映射为一张独立的表
person.hbm.xml
<hibernate-mapping package="com.atguigu.hibernate.union.subclass">
<class table="PERSONS" name="Person">
<id name="id" type="java.lang.Integer">
<column name="ID"/>
<generator class="hilo"/>
</id>
<property name="name" type="java.lang.String">
<column name="NAME"/>
</property>
<property name="age" type="int">
<column name="AGE"/>
</property>
<union-subclass table="STUDENTS" name="Student">
<property name="school" type="string" column="SCHOOL"/>
</union-subclass>
</class>
</hibernate-mapping>
PERSONS表字段:ID,NAME,AGE
STUDENTS表字段:ID,NAME,AGE,SCHOOL
插入Students对象时,只插入STUDENTS表
插入Persons对象时,只插入PERSONS表
插入
两条插入记录
查询
查询父类记录:需把父表和子表汇总到一起,再做查询,性能偏弱
查询子类记录:只需查询一张表
优点:
不需要使用辨别者列
子类独有的列可以添加非空约束
缺点:
冗余字段多