【SSH系列】Hibernate映射 -- 继承映射
来源:程序员人生 发布时间:2016-07-21 09:10:21 阅读次数:3361次
开篇前言
在前面的博文中,小编介绍了hibernate中的映照,1对1,1对多,多对多,单向,双向等,今天这篇博文,小编主要来介绍1下hibernate中的继承映照,小火伴都知道在C#中,如果想要实现继承,直接在子类中添加冒号便可继承父类,在java中可以用关键字extends实现,那末在hibernate中,甚么是继承映照呢?继承映照的方式又是甚么?继承映照具有几种策略呢?不同策略之间又存在着怎样样的区分和联系呢?该博文,小编就来简单的总结1下hibernate中的继承映照。
继承映照是甚么
首先,我们来看这样的1张表结构:
上述的表结构就是继承映照的1种,小猪猪和小鸟鸟他们共用了字段Name和Sex,除此以外,有些字段是针对某种数据而存在的,所以在数据库中为空,如上所,weight是针对小猪猪而言的,而height是针对小鸟鸟而言的,从上面的表结构,我们可以得出,有些字段是共用的,有些字段是自己独有的,她们通过type这个字段来进行区分,ok,小编相信,小火伴们现在对继承映照已有了1定的了解,接着小编来介绍继承映照的方式。
继承映照方式
在前面的博文中,小编提到过,c#和java中的继承,但是在数据库的世界中,表之间是没有任何关键字可以明确指明这两张表的父子关系,表与表是没有继承关系这样的说法的。为了将程序领域中的继承关系反应到数据中,Hibernate为我们提供了3种策略,分别是:
a、每颗类继承树1张表;
b、每一个类1张表;
c、每一个具体类1张表;
我们仍然从uml入手,看对象模型,以下所示:
Pig和Bird都继承Animal,她们都有id,name,sex,但是Pig主要看weight,而Bird主要看height,此时如果把这些数据存入到数据库中,可以有3种方案,也就是3种策略。ok,接下来结合Animal这个例子,分别对3种策略进行讲授。
第1种、每颗类继承树1张表
这类方式,只生成1个table,对应的继承映照策略是“单表继承”。如图:
每颗类继承树1张表,也就是使用1张表表示所有继承体系下的类的属性的并集,这类策略是使用<subclass>标签来实现的。由于类继承体系下会有许多个子类,要把多个类的信息寄存在1张表中,必须有某种机制来辨别哪些记录是属于哪一个类的。Hibernate中的这类机制就是,在表中添加1个字段,用这个字段的值来进行辨别。在表中添加这个标示列使用<discriminator>标签来实现,hbm.xml文件以下所示:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<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"/>
<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种、每一个类1张表 这类方式,每一个类生成1个table,对应的继承策略是“类表继承”。如图:
这类策略是使用<joined-subclass>标签来定义子类的。父类、子类都对应1张数据库表。在父类对应的数据库表中,它存储了所有记录的公共信息,实际上该父类对应的表会包括所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所独有的属性映照的字段。子类对应的数据表与父类对应的数据表,通过1对1主键关联的方式关联起来。Hbm.xml文件以下所示:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping⑶.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
<class name="Animal" table="t_animal">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<properties name="sex"/>
<joined-subclass name="Pig" table="t_pig">
<key column ="pid"/>
<property name="weight"/>
</joined-subclass>
<joined-subclass name="Bird" table="t_bird">
<key column = "bird"/>
<property name="height"/>
</joined-subclass>
</class>
</hibernate-mapping>
第3种、每一个具体类1张表
这类方式,生成3张表,对应的策略是“具体表继承”,以下图所示:
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠