Hibernate承袭策略
Hibernate继承策略
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; } }
第二种策略是每个类一张表:
@Entity @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS) @TableGenerator( //一个类一张表,最重要的是要保证它们的id由一个生成器产生,@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)//这个就是用表生成器生成的,用同一个生成器就可以控制它们的id不重复 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; } }