繼承映射在 Annotation 中使用 @Inheritance 註解,而且須要使用 strategy 屬性指定繼承策略,繼承策略有 SINGLE_TABLE、TABLE_PER_CLASS 和 JOINED 三種。java
1、SINGLE_TABLE數據庫
SINGLE_TABLE 是將父類和其全部的子類集合在一塊,存在一張表中,並建立一個新的字段來判斷對象的類型。code
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: @Id7: @GeneratedValue8: private int id;9: private String name;10: //Getters and setters omitted here...11: }
@Inheritance 的 strategy 屬性是指定繼承關係的生成策略,@DiscriminatorColumn 註解做用是指定生成的新的判斷對象類型的字段的名稱和類型,@DiscriminatorValue 註解是肯定此類(Person)的標示,即 DiscriminatorColumn 的值。繼承
Student.java:it
1: @Entity2: @DiscriminatorValue("student")3: public class Student extends Person{4: private int score;5: //Getters and setters omitted here...6: }
Teacher.java:io
1: @Entity2: @DiscriminatorValue("teacher")3: public class Teacher extends Person{4: private String title;5: //Getters and setters omitted here...6: }
生成的數據庫表以下:class
存入數據後結構以下:im
2、TABLE_PER_CLASS數據
TABLE_PER_CLASS 是爲每個類建立一個表,這些表是相互獨立的。
Person.java:
1: @Entity2: @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)3: public class Person {4: @Id5: private int id;6: private String name;7: //Getters and setters omitted here...8: }
Student.java:
1: @Entity2: public class Student extends Person{3: private int score;4: //Getters and setters omitted here...5: }
Teacher.java:
1: @Entity2: public class Teacher extends Person{3: private String title;4: //Getters and setters omitted here...5: }
建立的數據庫表以下:
3、JOINED
JOINED 是將父類、子類分別存放在不一樣的表中,而且創建相應的外鍵,以肯定相互之間的關係。
Person.java:
1: @Entity2: @Inheritance(strategy=InheritanceType.JOINED)3: public class Person {4: @Id5: @GeneratedValue6: 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 相似。
生成的數據庫表以下: