Hibernate继承策略总共有三种,一种是共用一张表;一种是每个类一张表,表里面储存子类的信息和父类的信息;还有一种是通过表连接的方式,每个类都有一张表,但是子类对应的表只保存自己的信息,父类对应的表保存父类的信息,它们之间通过子类表和父类表的关联来获取所有的信息。
第一种方式,即共用一张表:
-
@Entity
-
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
-
@DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)
-
@DiscriminatorValue("person")
-
public class Parent {
-
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("child1")
-
public class Child1 extends Parent {
-
private String email;
-
-
public String getEmail() {
-
return title;
-
}
-
-
public void setEmail(String email) {
-
this.email = email;
-
}
-
-
-
}
-
-
-
-
@Entity
-
@DiscriminatorValue("child2")
-
public class Child2 extends Parent {
-
-
private String address;
-
-
public String getAddress() {
-
return score;
-
}
-
-
public void setAddress(String address) {
-
this.address = address;
-
}
-
-
}
这种情况父类和所有子类的所有信息都保存在同一张表里面,通过我们指定的@DiscriminatorColumn对应的@DiscriminatorValue来区别不同的类。 当没有指定@DiscriminatorValue的时候将使用全类名来作为DiscriminatorValue。
第二种策略是每个类一张表,保存所有信息:
-
@Entity
-
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
-
@TableGenerator(
-
name="t_gen",
-
table="t_gen_table",
-
pkColumnName="t_pk",
-
valueColumnName="t_value",
-
pkColumnValue="person_pk",
-
initialValue=1,
-
allocationSize=1
-
)
-
public class Parent {
-
private int id;
-
private String name;
-
-
@Id
-
@GeneratedValue(generator="t_gen", strategy=GenerationType.TABLE)
-
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
-
public class Child2 extends Parent {
-
-
private String address;
-
-
public String getAddress() {
-
return score;
-
}
-
-
public void setAddress(String address) {
-
this.address = address;
-
}
-
-
}
-
-
-
@Entity
-
public class Child1 extends Parent {
-
private String email;
-
-
public String getEmail() {
-
return title;
-
}
-
-
public void setEmail(String email) {
-
this.email = email;
-
}
-
-
-
}
弟三种方式是采用表连接的方式:
-
@Entity
-
@Inheritance(strategy=InheritanceType.JOINED)
-
-
public class Parent {
-
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
-
public class Child2 extends Parent {
-
-
private String address;
-
-
public String getAddress() {
-
return score;
-
}
-
-
public void setAddress(String address) {
-
this.address = address;
-
}
-
-
}
-
-
-
@Entity
-
public class Child1 extends Parent {
-
private String email;
-
-
public String getEmail() {
-
return title;
-
}
-
-
public void setEmail(String email) {
-
this.email = email;
-
}
-
-
-
}
采用表连接的情况,还是每个类拥有自己的一张表,只是子类对应的表只保存子类的信息,其父类的信息由父类的表保存。当需要获取子类的完整信息时通过表连接的方式连接子类的表和父类的表获取对应信息。可以在子类的表上标注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子类表相对于父类表外键的名称。
Hibernate实体对象继承策略
原文:http://blog.csdn.net/elim168/article/details/40535517