繼承映射在 Annotation 中使用 @Inheritance 注解,並且需要使用 strategy 屬性指定繼承策略,繼承策略有 SINGLE_TABLE、TABLE_PER_CLASS 和 JOINED 三種。
一、SINGLE_TABLE
SINGLE_TABLE 是將父類和其所有的子類集合在一塊,存在一張表中,並創建一個新的字段來判斷對象的類型。
Person.java:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator",discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("person")
public class Person {
@Id
@GeneratedValue
private int id;
private String name;
//Getters and setters omitted here...
}
@Inheritance 的 strategy 屬性是指定繼承關系的生成策略,@DiscriminatorColumn 注解作用是指定生成的新的判斷對象類型的字段的名稱和類型,@DiscriminatorValue 注解是確定此類(Person)的標示,即 DiscriminatorColumn 的值。
Student.java:
@Entity @DiscriminatorValue("student") public class Student extends Person{ private int score; //Getters and setters omitted here... }
Teacher.java:
@Entity @DiscriminatorValue("teacher") public class Teacher extends Person{ private String title; //Getters and setters omitted here... }
生成的數據庫表如下:
存入數據后結構如下:
二、TABLE_PER_CLASS
TABLE_PER_CLASS 是為每一個類創建一個表,這些表是相互獨立的。
Person.java:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class Person {
@Id
private int id;
private String name;
//Getters and setters omitted here...
}
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 類似。
生成的數據庫表如下: