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 类,原理同上。

扫描二维码关注公众号,回复: 664354 查看本文章
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)
);

猜你喜欢

转载自shuitao-cao.iteye.com/blog/2287623