SSH快速进阶——Hibernate继承映射:每个具体类映射一张表
Posted dannyhoo6688
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH快速进阶——Hibernate继承映射:每个具体类映射一张表相关的知识,希望对你有一定的参考价值。
上篇文章说的是每个类映射一张表,不管是父类还是子类。与上篇文章不同的是,这里是每个“具体类”映射一张表,什么意思呢?就是让每个子类(具体的、有意义的类)映射一张表。
场景
与上篇文章场景一样,如下类图
上图中Pig类和Bird类继承Animal类,要让每个具体类映射一张表,就是只映射Pig和Bird,如下表所示:
(表 1)
上面的表有个特点就是,t_pig和t_bird的主键永远都不会相同。因为表面上看起来这是两张表,但实际上存储的都是动物(同一类型),所以还可以看做是一张表。
配置
PO对象
这里采用uuid的主键生成策略,父类Animal的id为String类型,其他实体类没有任何变化。(当然也可以用其他生成策略比如assigned等)
Animal.java
public class Animal {
private String id;
private String name;
private boolean sex;
//getter、setter
}
Bird.java
public class Bird extends Animal{
private int height;
//getter、setter
}
Pig.java
public class Pig extends Animal{
private int weight;
//getter、setter
}
映射文件
配置映射文件时,父类还用<class>
标签来定义即可;用<union-subclass>
标签定义两个子类,且每个类对应的表的信息是完全的,包含了所有从父类继承下来的属性。子类的特有属性同样用<property>
定义即可。用abstract
属性表示父类Animal为抽象类,这样Animal就不会映射成表了。
Extends.hbm.xml
<hibernate-mapping package="com.danny.hibernate">
<class name="Animal" abstract="true">
<id name="id">
<generator class="uuid"/>
</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>
在配置文件中 <union-subclass>
标签中不需要key值了,而且Animal的主键生成策略不能是自增(native)了,如果自增的话,pig表中第一条记录id为1,bird表中第一条记录也为1,而它们在实际意义上属于同一类型(可以看做在一张表中),否则可能造成不同子类对应表中的主键相同,所以主键不可一致。
启动程序执行的建表语句如下:
drop table if exists t_bird
drop table if exists t_pig
create table t_bird (id integer not null, name varchar(255), sex bit, height integer, primary key (id))
create table t_pig (id integer not null, name varchar(255), sex bit, weight integer, primary key (id))
测试
对对象的操作同上篇文章《【SSH快速进阶】——Hibernate继承映射:每棵继承树映射一张表》中的测试一致。
这种方案相对于上层实现(增删改查等操作)基本不变,对象模型父类Animal的主键为String类型(要是int类型则主键生成策略不能设设置为自增(native),这时需要添加的时候手动设置主键。
总结
此方案跟上篇文章的方案差不多,这里还有一个缺点就是主键不能自增。
【Hibernate继承映射综合分析】
如果系统需要经常进行查操作且子类数量较多,则建议用第一种方案,即每棵生成树映射一张表,这也是最常用的方法,效率较高。
如果追求细粒度的设计且子类数量不多,则可以用后两种方案:每个类映射一张表或每个具体类映射一张表。
【 转载请注明出处——胡玉洋《【SSH快速进阶】——Hibernate继承映射:每个具体类映射一张表》】
以上是关于SSH快速进阶——Hibernate继承映射:每个具体类映射一张表的主要内容,如果未能解决你的问题,请参考以下文章