|
在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)
- @Entity
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- @Table(name = "WINDOW_FILE")
- @DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)
- @DiscriminatorValue("WindowFile")
- public class WindowFile {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Integer id;
-
- @Basic
- @Column(name = "NAME")
- private String name;
-
- @Basic
- @Column(name = "TYPE")
- private String type;
-
- @Basic
- @Column(name = "DATE")
- private Date date;
-
- }
后定義2個(gè)子類(lèi)
- @Entity
- @DiscriminatorValue("Folder")
- public class Folder extends WindowFile {
-
- @Basic
- @Column(name = "FILE_COUNT")
- private Integer fileCount;
-
- }
- @Entity
- @DiscriminatorValue("Document")
- public class Document extends WindowFile {
-
- @Basic
- @Column(name = "SIZE")
- private String size;
-
- }
以上通過(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ō)明。
- @Entity
- @Table(name = "T_ANIMAL")
- @Inheritance(strategy = InheritanceType.JOINED)
- public class Animal {
-
- @Id
- @Column(name = "ID")
- @GeneratedValue(strategy = GenerationType.AUTO)
- private Integer id;
-
- @Column(name = "NAME")
- private String name;
-
- @Column(name = "COLOR")
- private String color;
-
- }
- @Entity
- @Table(name = "T_BIRD")
- @PrimaryKeyJoinColumn(name = "BIRD_ID")
- public class Bird extends Animal {
-
- @Column(name = "SPEED")
- private String speed;
-
- }
- @Entity
- @Table(name = "T_DOG")
- @PrimaryKeyJoinColumn(name = "DOG_ID")
- public class Dog extends Animal {
-
- @Column(name = "LEGS")
- private Integer legs;
-
- }
實(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)
- @Entity
- @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- @Table(name = "T_VEHICLE")
- public class Vehicle {
-
- @Id
-
- @Column(name = "ID")
- private Integer id;
-
- @Column(name = "SPEED")
- private Integer speed;
-
- }
- @Entity
- @Table(name = "T_CAR")
- public class Car extends Vehicle {
-
- @Column(name = "ENGINE")
- private String engine;
-
- }
一旦使用這種策略就意味著你不能使用AUTO generator 和IDENTITY generator,即主鍵值不能采用數(shù)據(jù)庫(kù)自動(dòng)生成。
實(shí)際表結(jié)構(gòu)如下:
T_VEHICLE ID,SPEED
T_CAR ID,SPEED,ENGINE
|