继承映射在 Annotation 中使用 @Inheritance 注解,并且需要使用 strategy 属性指定继承策略,继承策略有 SINGLE_TABLE、TABLE_PER_CLASS 和 JOINED 三种。
一、SINGLE_TABLE
SINGLE_TABLE 是将父类和其所有的子类集合在一块,存在一张表中,并创建一个新的字段来判断对象的类型。
Person.java:
1: @Entity
2: @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
3: @DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING)
4: @DiscriminatorValue("person")
5: public class Person {
6: @Id
7: @GeneratedValue
8: private int id;
9: private String name;
10: //Getters and setters omitted here...
11: }
@Inheritance 的 strategy 属性是指定继承关系的生成策略,@DiscriminatorColumn 注解作用是指定生成的新的判断对象类型的字段的名称和类型,@DiscriminatorValue 注解是确定此类(Person)的标示,即 DiscriminatorColumn 的值。
Student.java:
1: @Entity
2: @DiscriminatorValue("student")
3: public class Student extends Person{
4: private int score;
5: //Getters and setters omitted here...
6: }
Teacher.java:
1: @Entity
2: @DiscriminatorValue("teacher")
3: public class Teacher extends Person{
4: private String title;
5: //Getters and setters omitted here...
6: }
生成的数据库表如下:
存入数据后结构如下:
二、TABLE_PER_CLASS
TABLE_PER_CLASS 是为每一个类创建一个表,这些表是相互独立的。
Person.java:
1: @Entity
2: @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
3: public class Person {
4: @Id
5: private int id;
6: private String name;
7: //Getters and setters omitted here...
8: }
Student.java:
1: @Entity
2: public class Student extends Person{
3: private int score;
4: //Getters and setters omitted here...
5: }
Teacher.java:
1: @Entity
2: public class Teacher extends Person{
3: private String title;
4: //Getters and setters omitted here...
5: }
创建的数据库表如下:
三、JOINED
JOINED 是将父类、子类分别存放在不同的表中,并且建立相应的外键,以确定相互之间的关系。
Person.java:
1: @Entity
2: @Inheritance(strategy=InheritanceType.JOINED)
3: public class Person {
4: @Id
5: @GeneratedValue
6: private int id;
7: private String name;
8: //Getters and setters omitted here...
9: }
子类中只需声明与父类不同的域即可:
Student.java:
1: @Entity
2: public class Student extends Person{
3: private int coat;
4: //Getters and setters omitted here...
5: }
Teacher.java 类似。
生成的数据库表如下:
上部分为转载的 地址
https://blog.csdn.net/benjamin_whx/article/details/44521315
现在通过一个(join)实例说明
package com.example.demo.entity;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
@Entity
@Table(name = "document")
@Inheritance(strategy = InheritanceType.JOINED)
@DynamicInsert
@DynamicUpdate
public class Document implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String fullName;
private String path;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
package com.example.demo.entity;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
@Entity
@Table(name = "image")
@PrimaryKeyJoinColumn(name = "ig_id")
@DynamicInsert
@DynamicUpdate
public class Image extends Document{
@OneToOne(fetch=FetchType.LAZY)
@JoinColumn(name = "st_id")
private Student student;
public Student getStudent() {
return student;
}
public void setStudent(Student student) {
this.student = student;
}
}
生成的数据表
实现保存
public void saveImage(){
Student student = new Student();
student.setName("iuiuiuu");
student.setBirthday(new Date());
studentRepository.save(student);
Image image = new Image();
image.setStudent(student);
image.setFullName("image.png");
image.setPath("d://image");
imageRepository.save(image);
}
学生表
文件表
image表