Entity 實體繼承策略 SINGLE_TABLE

 通過上一篇文章“Entity 使用單表策略實現繼承(二)”,我們可以知道默認情況下辨別字段(Discriminator Column)名叫“DTYPE”,這是一個VARCHAR類型的字段,儲存的內容是實體類的名字。
 如果默認設置不合適,@Discriminator 註解允許更改辨別字段名和字段類型,@DiscriminatorValue 註解可以重寫默認辨別字段的值。
 本例,我指定辨別字段名爲“DISC”(默認是 DTYPE),指定字段類型爲CHAR(默認是String),指定Item 實體類的辨別字段值爲“I”、Book 實體類的辨別字段值爲“B”、CD 實體類的辨別字段值爲“C”。

 

Item 實體類:在數據中有對應表,表名爲Item.

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "disc", discriminatorType = DiscriminatorType.CHAR)
@DiscriminatorValue("I")
public class Item {

	@Id @GeneratedValue
	protected Long id;
	@Column(nullable = false)
	protected String title;
	@Column(nullable = false)
	protected Float price;
	protected String description;
	
	// Constructors, setters, getters
}

 

Book實體類:在數據庫中對應表爲Item,也就是說Book 自身的字段需要出現在Item數據表中。

@Entity
@DiscriminatorValue("B")
public class Book extends Item {

	private String isbn;
	private String publisher;
	private Integer nbOfPage;
	private Boolean illustrations;
	
	// Constructors, setters, getters
}

 

CD實體類:原理同Book,在數據庫中對應的表爲Item

@Entity
@DiscriminatorValue("C")
public class CD extends Item {

	private String musicCompany;
	private Integer numberOfCDs;
	private Float totalDuration;
	private String gender;
	// Constructors, setters, getters
}

 

ITEM表:該表包含了 Item 實體類及其子類的所有字段。

如果是持久化Book 類,該類數據將存儲到Book 實體類和 Item 實體類的相關字段中,Item表中的DISC 字段自動存儲字符串“B”。

如果是持久化CD 類,原理同上。

CREATE TABLE ITEM (
	ID BIGINT,
	DISC CHAR(1),
	TITLE VARCHAR(50),
	PRICE FLOAT,
	DESCRIPTION VARCHAR(200),
	ISBN VARCHAR(50),
	PUBLISHER VARCHAR(50),
	NBOFPAGE INT,
	ILLUSTRATIONS SMALLINT,
	MUSICCOMPANY VARCHAR(50),
	NUMBEROFCDS INT,
	TOTALDURATION FLOAT,
	GENDER VARCHAR(10),
	PRIMARY KEY (ID)
);

 

發佈了35 篇原創文章 · 獲贊 9 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章