JPA entity承袭策略
JPA entity继承策略
JPA支持3种类型的继承形式:
1.Single Table Strategy ,单表策略,一张表包含基类与子类的所有数据,很多情况下都是采用这样的冗余设计,通过一个discriminator来区分。
2.Table Per Class Strategy ,每个子类对应一张表,每张表都拥有基类的属性,基类不会生成表。
3.Join Strategy ,仍然是每个子类对应一张表,但此表中不包含基类的属性,仅仅是此子类的扩展属性,共享基类的属性。
下面是SingleTable的一个小例子:
基类:
子类:
子类:
生成的数据库表:

JPA支持3种类型的继承形式:
1.Single Table Strategy ,单表策略,一张表包含基类与子类的所有数据,很多情况下都是采用这样的冗余设计,通过一个discriminator来区分。
2.Table Per Class Strategy ,每个子类对应一张表,每张表都拥有基类的属性,基类不会生成表。
3.Join Strategy ,仍然是每个子类对应一张表,但此表中不包含基类的属性,仅仅是此子类的扩展属性,共享基类的属性。
下面是SingleTable的一个小例子:
基类:
package com.kevin.ejb.extendtable; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table(name = "t_animal") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "animalType", discriminatorType = DiscriminatorType.STRING) public class Animal { @Id @GeneratedValue(strategy = GenerationType.AUTO) private int id; private String name; private String sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } }
子类:
package com.kevin.ejb.extendtable; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table(name = "t_cat") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING) @DiscriminatorValue(value = "cat") public class Cat extends Animal { private String nickname; public String getNickname() { return nickname; } public void setNickname(String nickname) { this.nickname = nickname; } }
子类:
package com.kevin.ejb.extendtable; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorType; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.Table; @Entity @Table(name = "t_dog") @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(discriminatorType = DiscriminatorType.STRING) @DiscriminatorValue(value = "dog") public class Dog extends Animal { private String address; public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
生成的数据库表: