通过上一篇文章“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 查看本文章
![](/qrcode.jpg)
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) );