Hibernate繼承映射(@Inheritance)


繼承映射在 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...
     }

  

生成的數據庫表如下:

image

存入數據后結構如下:

image


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

創建的數據庫表如下:

image

 


三、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 類似。

生成的數據庫表如下:

JOINED


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM