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

相關文章
相關標籤/搜索