JPA使用注解@Inheritance处理继承映射
3个月前 • 154次点击 • 来自 后端
标签: JPA
原文链接:Hibernate继承映射(@Inheritance)
类的继承分析
- 多类一表:多个类之间的属性相同,唯一的区别就是类型上的差异(类名不同),这个时候我们可以为这个共同属性的类建立一个父类,只让父类应射到数据库。
- 多类多表:把多个类之间公有的属性提取出来放在它们公有的父类中,各个类之间可以定义自己特有的属性,子类和父类在数据库中都有相应的表和其对应。
- 子类建表:把多个类之间公有的属性提取出来放在它们公有的父类中,各个类之间可以定义自己特有的属性,仅仅子类和数据库中的表建立关联关系,父类中的属性延续到每一个子类中,在数据库中每一个子类对应的表都有父类中定义的属性。
JPA使用Hibernate继承映射(@Inheritance)来处理上述继承关系
SINGLE_TABLE
代码
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)//指定继承关系的生成策略
@DiscriminatorColumn(name = "discriminator", discriminatorType = DiscriminatorType.STRING)//指定生成的新的判断对象类型的字段的名称和类型
@DiscriminatorValue("person")//确定类(Person)的标示
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
}
@Entity
@DiscriminatorValue("student")
public class Student extends Person{
private int score;
}
@Entity
@DiscriminatorValue("teacher")
public class Teacher extends Person{
private String title;
}
数据表结构如下
存入数据后如下
TABLE_PER_CLASS
TABLE_PER_CLASS
为父类和子类生成各自的表
代码
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)//指定继承关系的生成策略
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
}
@Entity
public class Student extends Person{
private int score;
}
@Entity
public class Teacher extends Person{
private String title;
}
数据表结构如下
JOINED
JOINED
是将父类、子类分别存放在不同的表中,并且建立相应的外键,以确定相互之间的关系。
代码
@Entity
@Inheritance(strategy = InheritanceType.JOINED)//指定继承关系的生成策略
public class Person {
@Id
@GeneratedValue
private Long id;
private String name;
}
@Entity
public class Student extends Person{
private int score;
}
@Entity
public class Teacher extends Person{
private String title;
}
数据表结构如下