Hibernate中支持3种类型的继承形式:
1.Table per concrete class
表与子类之间的独立一对一关系。
2.Table per subclass
每个子类对应一张子表,并与主类共享主表。
3.Table per class hierarchy
表与类的一对多关系
3种方法的比较。
比较方面
|
Table per concrete class
|
Table per subclass
|
Table per class hierarchy
|
关系数据模型的复杂度
|
缺点:表中含有重复字段
|
缺点:表的数目最多,并且表之间还有外键 参照关系
|
优点:只需要一个表
|
查询性能
|
缺点:查询父类对象,也必须查询所有具体的 子类对应的表
|
缺点:需要进行表的内连接或者左外连接
|
优点:无需表连接,查询性能好
|
数据库Schema的可维护性
|
缺点:父类发生修改,必须修改所有子类的表
|
优点:某个类的属性发生变化,只需修改和这个类对应的表
|
优点:只需要修改一张表
|
是否支持多态查询和关联
|
缺点:不支持(实际上,是可以做到的,做法是指定完整的父类路径,参见具体例子实现)
|
优点:支持
|
优点:支持
|
是否符合关系数据模型的常规设计
|
优点:符合
|
优点:符合
|
缺点: 1)在表中,引入额外的区分子类的类型的字段 2)如果子类中的某个属性不允许为null,在表中 无法为对应的字段创建not null约束
|
配置文件说明
|
无需变化
|
使用joined-subclass节点来说明
|
使用discriminator节点来说明
|
下面,结合一个例子,分别讨论。
对一个电子商务系统而言,不同的的货物既有共性,也有各自不同的属性。货物都有厂商,名称等属性,而书籍有页数,DVD有分区属性。在面向对象的程序设计中,我们通常将共性抽象为一个基类,而以不同的子类体现具体的特性。
共性归为父类TItem,属性如下:
id:Integer
factory:String
name:String
代表书籍的子类TBook,属性如下:
pageCount:int
代表DVD的字类TDVD,属性如下:
regionCode:String
这三个POJO类对应的Java代码如下:
父类TItem.java
package cn.blogjava.start;
import java.io.Serializable;
public class TItem implements Serializable {
private Integer id;
private String manufacturer;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getManufacturer() {
return manufacturer;
}
public void setManufacturer(String manufacturer) {
this.manufacturer = manufacturer;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
子类TBook
package cn.blogjava.start;
import java.io.Serializable;
public class TBook extends TItem implements Serializable {
private int pageCount;
public int getPageCount() {
return pageCount;
}
public void setPageCount(int pageCount) {
this.pageCount = pageCount;
}
}
子类TDVD
package cn.blogjava.start;
import java.io.Serializable;
public class TDVD extends TItem implements Serializable{
private String regionCode;
public String getRegionCode() {
return regionCode;
}
public void setRegionCode(String regionCode) {
this.regionCode = regionCode;
}
}
下面使用3种不同方式,一一实现。