类之间有一种关系叫做继承关系,这种关系描述为子类继承了父类所有的属性和方法。
继承关系在hibernate框架中主要有三种表现方式
父类(Animal)和子类(Pig、Bird)只生成一张表,该表中包括了父类和子类的所有属性,
因为类继承树肯定是对应多个类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。
关于鉴别值(Type)在存储的时候hibernate会自动存储,在加载的时候会根据鉴别值取得相关的对象
t_animal
Id |
Name |
Sex |
Weight |
Height |
Type |
1 |
小猪 |
True |
200 |
P |
|
2 |
小鸟 |
False |
50 |
B |
Hibernate中的映射文件:
<?xml version="1.0"?> |
请注意红色的关键字subclass(控制子类生成方式)和鉴别字段和鉴别值
优点:查询效率高,符合数据库设计粗粒度(推荐)
缺点:存在冗余字段,有些字段是子类不具有的属性。
父类(Animal)和子类(Pig、Bird)均生成一张表,其中父类表中存放公共的属性,子类表中分别存放各自的属性字段,子表的主键均来自主表。如下表所示:
Hibernate中的映射文件
<?xml version="1.0"?> |
请注意使用红色的关键字joined-subclass(控制子类生成方式)
优点:数据结构清晰,没有冗余
缺点:类的继承层次比较多的话,造成生成的表也比较多,增删改查效率低下
父类Animal不会生成表,每个子类(Pig、Bird)生成一张表。子类除具有父类的所有属性字段外,还有自己的属性字段,如下图所示:
t_pig
Id |
Name |
Sex |
Weight |
1 |
小猪 |
True |
200 |
t_bird
Id |
Name |
Sex |
Height |
2 |
小鸟 |
False |
50 |
hibernate中的映射文件
<?xml version="1.0"?> |
请注意红色的关键字abstract(控制父类表不再生成) 和 union-subclass (控制子类生成方式)
优点:数据结构清晰
缺点:两个子表的主键不能重复,不能使用数据库的自增方式生成主键。
1. 通过总结这三种方式的优缺点发现,使用继承树生成一张表的方式似乎更符合数据库粗粒度设计的原则。当然数据量非常大的话也可以考虑每个类生成一张表的成方式
2.程序的对象模型没有发生变化,变化的是关系模型。
这就是hibernate的好处,想改变关系模型,只需要改变映射文件即可。