小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

JPA 繼承方式

 KILLKISS 2013-07-10

JPA中,實(shí)體繼承關(guān)系的映射策略共有三種:?jiǎn)伪砝^承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。

 

1.單表繼承策略

   

    單表繼承策略,父類(lèi)實(shí)體和子類(lèi)實(shí)體共用一張數(shù)據(jù)庫(kù)表,在表中通過(guò)一列辨別字段來(lái)區(qū)別不同類(lèi)別的實(shí)體。具體做法如下:

a.在父類(lèi)實(shí)體的@Entity注解下添加如下的注解:

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

 

b.子類(lèi)實(shí)體的@Entity注解下添加如下的注解:

@DiscriminatorValue(子類(lèi)實(shí)體辨別字段列值) 

 

 

定義了一個(gè)父類(lèi)

 

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個(gè)子類(lèi)

 

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

 

 以上通過(guò)列DISCRIMINATOR的不同,區(qū)分具體父子實(shí)體。

 

實(shí)際表結(jié)構(gòu)如下:

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

 

當(dāng)你使用WindowFile實(shí)體時(shí),實(shí)際表的字段為DISCRIMINATOR='WindowFile',SIZE與FILE_COUNT永遠(yuǎn)是空

當(dāng)使用Folder實(shí)體時(shí),DISCRIMINATOR='Folder',SIZE永遠(yuǎn)是空,FILE_COUNT為實(shí)際值。

Document同理,與Folder類(lèi)似。

 

2.Joined策略

 

    父類(lèi)實(shí)體和子類(lèi)實(shí)體分別對(duì)應(yīng)數(shù)據(jù)庫(kù)中不同的表,子類(lèi)實(shí)體的表中只存在其擴(kuò)展的特殊屬性,父類(lèi)的公共屬性保存在父類(lèi)實(shí)體映射表中。具體做法:

 

 

 

@Inheritance(Strategy=InheritanceType.JOINED)

 

子類(lèi)實(shí)體不需要特殊說(shuō)明。

 

 

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

 

 

實(shí)際表結(jié)構(gòu)如下:

T_ANIMAL  ID,COLOR,NAME

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

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

 

3.Table_PER_Class策略

 

Table_PER_Class策略,父類(lèi)實(shí)體和子類(lèi)實(shí)體每個(gè)類(lèi)分別對(duì)應(yīng)一張數(shù)據(jù)庫(kù)中的表,子類(lèi)表中保存所有屬性,包括從父類(lèi)實(shí)體中繼承的屬性。具體做法:

只需在父類(lèi)實(shí)體的@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 { // 基類(lèi)  
  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;// 發(fā)動(dòng)機(jī)  
  7.     //省略get set  
  8. }  

 

一旦使用這種策略就意味著你不能使用AUTO generator 和IDENTITY generator,即主鍵值不能采用數(shù)據(jù)庫(kù)自動(dòng)生成。

 

實(shí)際表結(jié)構(gòu)如下:

T_VEHICLE  ID,SPEED

T_CAR  ID,SPEED,ENGINE

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多