继承映射在 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 相似。
生成的数据库表以下: