关于继承和多态查询,由于篇幅过长,将会放到两篇文章
目前有一个Person类,Worker继承自Person,并添加了2个属性,省略setter和getter
具体如下:
public class Person {
private Integer id;
private String name;
private Integer age;
}
public class Worker extends Person{
private String job;
private String unit;
}
hibernate为我们提供了三种形式来表示继承关系,分别是:subclass,joined-subclass,union-subclass
我们可以先从生成的数据库表来直观的感受下三者的区别:
1.subclass
可以看到父类和子类存在同一张表中,其中的role字段是辨别者列,用于辨别这条记录是父类还是子类
2.join-subclass
不同于subclass,joined-subclass和union-subclass都是需要两种表来存储。首先看看joined-subclass生成的两张数据库表:
父类表:
子类表:
这种方式也很容易理解,就是父类表存储父类字段,子类表存储子类字段,虽然没有了辨别者列,但是额外增加了一个person_id来表示二者的关系,我们可以看一下子类表的外键
3.union-subclass
这种方式只要和joined-subclass比较一下就很清楚了,join-subclass是父类表存储父类字段,子类表存储子类字段,那么union-subclass就是父类表存储父类字段,而子类表既要存储父类字段,也要存储子类字段
父类表:
子类表:
下面通过实体映射文件和测试代码来详述这三种继承
1.subclass,注意看我加粗的地方(如果csdn无法显示加粗,请找到class和subclass的discriminator-value属性),由于父类表和子类表共存在一张表中,因此需要一个辨别者列,我们需要分别对父类和子类设置辨别者列的值,本例中使用PERSON和WORK