Hibernate之jpa實體映射的三種繼承關系


在JPA中,實體繼承關系的映射策略共有三種:單表繼承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。

 

1.單表繼承策略

   

    單表繼承策略,父類實體和子類實體共用一張數據庫表,在表中通過一列辨別字段來區別不同類別的實體。具體做法如下:

a.在父類實體的@Entity注解下添加如下的注解:

@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨別字段列名”)
@DiscriminatorValue(父類實體辨別字段列值)

 

b.在子類實體的@Entity注解下添加如下的注解:

@DiscriminatorValue(子類實體辨別字段列值) 

 

 

定義了一個父類

 

Java代碼  
  1. @Entity  
  2. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)  
  3. @Table(name = "WINDOW_FILE")  
  4. @DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)  
  5. @DiscriminatorValue("WindowFile")  
  6. public class WindowFile {  
  7.   
  8.     @Id  
  9.     @GeneratedValue(strategy = GenerationType.AUTO)  
  10.     private Integer id;  
  11.   
  12.     @Basic  
  13.     @Column(name = "NAME")  
  14.     private String name;  
  15.   
  16.     @Basic  
  17.     @Column(name = "TYPE")  
  18.     private String type;  
  19.   
  20.     @Basic  
  21.     @Column(name = "DATE")  
  22.     private Date date;  
  23.     //省略get set  
  24. }  

 

后定義2個子類

 

Java代碼  
  1. @Entity  
  2. @DiscriminatorValue("Folder")  
  3. public class Folder extends WindowFile {  
  4.   
  5.     @Basic  
  6.     @Column(name = "FILE_COUNT")  
  7.     private Integer fileCount;  
  8.     //省略get set  
  9. }  

 

Java代碼  
  1. @Entity  
  2. @DiscriminatorValue("Document")  
  3. public class Document extends WindowFile {  
  4.   
  5.     @Basic  
  6.     @Column(name = "SIZE")  
  7.     private String size;  
  8.     //省略get set  
  9. }  

 

 以上通過列DISCRIMINATOR的不同,區分具體父子實體。

 

實際表結構如下:

WINDOW_FILE  DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT

 

當你使用WindowFile實體時,實際表的字段為DISCRIMINATOR='WindowFile',SIZE與FILE_COUNT永遠是空

當使用Folder實體時,DISCRIMINATOR='Folder',SIZE永遠是空,FILE_COUNT為實際值。

Document同理,與Folder類似。

 

2.Joined策略

 

    父類實體和子類實體分別對應數據庫中不同的表,子類實體的表中只存在其擴展的特殊屬性,父類的公共屬性保存在父類實體映射表中。具體做法:

 

 

 

 

 

@Inheritance(Strategy=InheritanceType.JOINED)

 

子類實體不需要特殊說明。

 

 

Java代碼  
  1. @Entity  
  2. @Table(name = "T_ANIMAL")  
  3. @Inheritance(strategy = InheritanceType.JOINED)  
  4. public class Animal {  
  5.   
  6.     @Id  
  7.     @Column(name = "ID")  
  8.     @GeneratedValue(strategy = GenerationType.AUTO)  
  9.     private Integer id;  
  10.   
  11.     @Column(name = "NAME")  
  12.     private String name;  
  13.   
  14.     @Column(name = "COLOR")  
  15.     private String color;  
  16.     //省略get set  
  17. }  

 

Java代碼  
  1. @Entity  
  2. @Table(name = "T_BIRD")  
  3. @PrimaryKeyJoinColumn(name = "BIRD_ID")  
  4. public class Bird extends Animal {  
  5.   
  6.     @Column(name = "SPEED")  
  7.     private String speed;  
  8.     //省略get set  
  9. }  

 

Java代碼  
  1. @Entity  
  2. @Table(name = "T_DOG")  
  3. @PrimaryKeyJoinColumn(name = "DOG_ID")  
  4. public class Dog extends Animal {  
  5.   
  6.     @Column(name = "LEGS")  
  7.     private Integer legs;  
  8.     //省略get set  
  9. }  

 

 

實際表結構如下:

T_ANIMAL  ID,COLOR,NAME

T_BIRD  SPEED,BIRD(既是外鍵,也是主鍵)

T_DOG  LEGS,DOG_ID(既是外鍵,也是主鍵)

 

3.Table_PER_Class策略:

 

Table_PER_Class策略,父類實體和子類實體每個類分別對應一張數據庫中的表,子類表中保存所有屬性,包括從父類實體中繼承的屬性。具體做法:

只需在父類實體的@Entity注解下添加如下注解:

@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)

 

Java代碼  
  1. @Entity  
  2. @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)  
  3. @Table(name = "T_VEHICLE")  
  4. public class Vehicle { // 基類  
  5.   
  6.     @Id  
  7.     // @GeneratedValue  
  8.     @Column(name = "ID")  
  9.     private Integer id;  
  10.   
  11.     @Column(name = "SPEED")  
  12.     private Integer speed;// 速度  
  13.     //省略get set  
  14. }  

 

Java代碼  
  1. @Entity  
  2. @Table(name = "T_CAR")  
  3. public class Car extends Vehicle {  
  4.   
  5.     @Column(name = "ENGINE")  
  6.     private String engine;// 發動機  
  7.     //省略get set  
  8. }  

 

一旦使用這種策略就意味着你不能使用AUTO generator 和IDENTITY generator,即主鍵值不能采用數據庫自動生成。

 

實際表結構如下:

T_VEHICLE  ID,SPEED

T_CAR  ID,SPEED,ENGINE


免責聲明!

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



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