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;
}

数据表结构如下

Made with in Shangrao,China By Devler.

Copyright © Devler 2012 - 2022

赣ICP备19009883号-1

Top ↑