Hibernate 继承映射

继承映射在 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

image

存入数据后结构以下:im

image

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

建立的数据库表以下:

image

 

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 相似。

生成的数据库表以下:

JOINED

相关文章
相关标签/搜索