Hibernate之继承映射
Hibernate的继承映射可以理解为两个持久化类之间的继承关系 例如老师和人之间的关系
持久化类 Person类
public class Person
{
private Integer id;
privvate String name;
private String sex;
public Person (){} // 无参构造器
public Person(Integer id,String name, String sex) // 带参数的构造器
{
this.id = id;
this.name = name;
this.sex = sex;
}
............. //省略 id属性 name属性 sex属性 的 setter和getter方法
}
持久化 Teacher类
public class Teacher extends Person
{ // 继承了父类的全部Field
private String className; //所带班级名
private String subject; //所教科目名
public Teacher(){} //无参构造器
public Teacher(String id,Sting name ,String sex,String className, String subject)
{
super(id,name,sex); //显示调用父类带三个参数的构造器
this.className = className;
this.subject = subject;
}
........// 继承了父类的getter和 setter方法 省略className属性 subject属性的getter和setter方法
}
有三种方式的继承映射 :
1.采用<subclass>元素的继承映射
在这种映射策略下,持久化父类 和 持久化子类 的实例对应的记录都将保存在一张数据表中。该数据表中额外需要增加一个数据列来记录该行记录是哪个类的实例。
这个列被称为辨别者列(discriminator).
该数据表有父类和所有子类的所有属性所对应的数据列 ,哪个对象实例如果没有该列的属性 ,则这个对象实例的对应记录的这列为null
映射文件配置如下 :
<class name="org.lingtong.pojo.Person" table="tb_person_info" discriminator-value="普通人"> //discriminator-value属性指定该持久化类的对象的辨别值 如果不写默认为全限定类名
<id name="id" column="ID">
<generator class="native"> //指定主键生成器策略
</id>
<discriminator column="FLAG" type="string" /> // 映射辨别列
.... //省略 name属性 sex属性与对应数据列的映射关系
<subclass name="org.lingtong.pojo.Teacher" discriminator-value="老师” /> //discriminator-value属性指定该持久化类的对象的辨别值 如果不写默认为全限定类名
......... //省略 className属性 subject属性与对应数据列的映射关系
//可以继续嵌套子类 但是永远保存在一张表中
</subclass>
</class>
2.采用<joined-subclass>元素的继承映射
采用这种策略 ,父类实例的属性保存在父类表中 ,而子类实例的属性则由父类表和子类表共同存储。将父类和子类共有的属性(即子类通过继承而来的属性)保存在父类表中 ,子类自己扩张增加的属性,则保存在子类表中 。
使用这种映射策略,无需使用辨别者列。但是需要为每个子类表使用<key>元素指定一列去关联父类表的主键列 。<key>元素对应的列 即充当主键又充当外键。
这种关系可以看成“纵向分割映射”
father 类 son类 grandson类
id id id
name name name //则 三个共有属性 形成父类表
sex sex sex
--------------------------------------------------------------
position position //则 两个 子类和孙子类的 共有属性 形成子类表
wife wife //需要指定一列 去关联父类表的主键列 (该列既是主键又是外键)
---------------------------------------------------------------
age //则 两个 由孙子类的 特有属性 形成孙子表
sport //需要指定一列 去关联之类表的主键列 (该列既是主键又是外键)
---------------------------------------------------------------
映射文件配置
<class name="org.lingtong.pojo.Father" table="tb_person_info1" > //discriminator-value属性指定该持久化类的对象的辨别值 如果不写默认为全限定类名
<id name="id" column="ID">
<generator class="native"> //指定主键生成器策略
</id>
.... //省略 name属性 sex属性与对应数据列的映射关系
<joined-subclass name="org.lingtong.pojo.Son" table="tb_person_info2" />
<key column="son_id">
..... // 省略 position属性 与 wife属性与对应数据列的映射关系
<joined-subclass name="org.lingtong.pojo.Son" table="tb_person_info3" />
<key column="grandson_id">
...... // 省略 age属性 与 sport属性与对应数据列的映射关系
</joined-subclass>
</joined-subclass>
</class>
通过这种映射方式形成的数据表
查询孙子类的实例对象对应的记录时 需要跨越三张表
查询子类的实例对象对应的记录时需要跨越两张表
查阅父类的对象实例对应的记录需要一张表
3.采用<union-subclass>元素的继承映射
"横向分割映射"