所有子类映射到一张表(1张表)
UML图
(1)实体类
public class Person {
//使用uuid,必须是String类型,int类型不支持
private Integer pid;
private String name;
//省了get/set
}
public class Programmer extends Person {
private String NotebookName;//笔记本名称
//省了get/set
public class Student extends Person{
private String score;
//省了get/set
}
(2)配置映射文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="cn.itcast.extendsMapping.Person" table="t_person">
<id name="pid">
<generator class="native"></generator>
</id>
<discriminator column="type_"></discriminator>
<property name="name" column="name"></property>
<subclass name="cn.itcast.extendsMapping.Programmer"
discriminator-value="_programmer">
<property name="NotebookName" column="NotebookName"></property>
</subclass>
<subclass name="cn.itcast.extendsMapping.Student"
discriminator-value="_student">
<property name="score" column="score"></property>
</subclass>
</class>
</hibernate-mapping>
(3)引入到核心配置文件:hibernate.cfg.xml
(4)运行代码测试
(5)生成的记录
(6)对映射文件的描述
(7)好处和弊端
什么情况下使用:子类比较多,并且子类的属性比较少
好处:因为使用一个映射文件,减少了映射文件的个数
弊端:不符合数据库设计原则,不太推荐使用
每个类映射到一张表(3张表)
还是以上面为例子,不同的只有映射文件
(1)映射文件:使用joined-subclass标签
<!--每个类映射到一张表 -->
<class name="cn.itcast.extendsMapping.Person" table="t_person">
<id name="pid">
<generator class="native"></generator>
</id>
<property name="name" column="name"></property>
<!--
key: 指定t_programmer表的外键字段 ,指向t_person表的主键
-->
<joined-subclass name="cn.itcast.extendsMapping.Programmer"
table="t_programmer">
<key column="t_person_fk"></key>
<property name="NotebookName" column="NotebookName"></property>
</joined-subclass>
<!--
key: 指定t_student表的外键字段,指向t_person表的主键
-->
<joined-subclass name="cn.itcast.extendsMapping.Student"
table="t_student">
<key column="t_person_fk"></key>
<property name="score" column="score"></property>
</joined-subclass>
</class>
(3)引入到核心配置文件:hibernate.cfg.xml
(4)运行代码测试
(5)生成的记录
(7)弊端
表结构比较复杂,如果想在子表中插入一条数据,需要执行两条sql,往父类中插入记录,还要往子类中插入数据
每个子类对应一张表,父类不对应(2张表)
还是以上面为例子,不同的只有映射文件和实体类:
需要注意:使用这个继承映射的时候,主键的增长策略不能是自增长
即generator class=“native”> 不能是native,而应该改成
uuid,但如果改成了uuid,那么类型必须为String类型
(1)映射文件:使用union-subclass标签
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!--
因为最终生成的t_person什么内容也没有,所以我想去除它
有人说不指定table属性值,那么它默认会用你的类名来做表名
应该使用abstract="true": 指定实体类对象不生成表
-->
<class name="cn.itcast.extendsMapping.Person" abstract="true">
<id name="pid">
<generator class="uuid"></generator>
</id>
<property name="name" column="name"></property>
<!--
每个表都需要主键,而t_programmer表最终生成的时候,
会从t_person中将pid作为自己的主键
-->
<union-subclass name="cn.itcast.extendsMapping.Programmer"
table="t_programmer">
<property name="NotebookName" column="NotebookName"></property>
</union-subclass>
<union-subclass name="cn.itcast.extendsMapping.Student"
table="t_student">
<property name="score" column="score"></property>
</union-subclass>
</class>
</hibernate-mapping>
(3)引入到核心配置文件:hibernate.cfg.xml
(4)运行代码测试
(5)生成的记录
最后:推荐使用这种,比较符合数据库的设计原则,而且也不会有一些繁琐的主外键关系。