三种方式(根据具体情况看,第一种和第三种稍多,第二种较少):
1. sigleTable(一张表)
2. tablePerClass(一个类一张表)
3. joined(一个主表存id和共有的字段等,其他的表存id和各子类特定的字段)
Peson、Student、Teacher的继承映射
第一种
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator",discriminatorType = DiscriminatorType.STRING)
@DiscriminatorValue("person")
public class Person {
private int id;
private String name;
@Id
@GeneratedValue
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;
}
}
@Entity
@DiscriminatorValue("student")
public class Student extends Person {
private int score;
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
@Entity
@DiscriminatorValue("teacher")
public class Teacher extends Person {
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
第二种(每个类一张表,且每张表的id不能重复(对mysql来说,主键生成策略就只能设成table))
第二种用起来也比较麻烦
第三种
比较方便,但多态load的时候要每张表查再union,和第二种差不多
父类中,写共有的字段和id
子类中,写自己扩展的字段和id,字表的id参考父类id
在父类中,写annotation即可
@Inheritance(strategy = InheritanceType.JOINED)