Hibernate實體對象繼承的方法
hibernate繼承策略總共有三種,一種是共用一張表;一種是每個類一張表,表里面儲存子類的信息和父類的信息;還有一種是通過表連接的方式,每個類都有一張表,但是子類對應(yīng)的表只保存自己的信息,父類對應(yīng)的表保存父類的信息,它們之間通過子類表和父類表的關(guān)聯(lián)來獲取所有的信息。
第一種方式,即共用一張表:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)//表示區(qū)分不同的對象的字段名
@DiscriminatorValue("person")//用來表示該對象是何種對象的,即區(qū)分器
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對應(yīng)的@DiscriminatorValue來區(qū)別不同的類。 當(dāng)沒有指定@DiscriminatorValue的時候?qū)⑹褂萌惷麃碜鳛镈iscriminatorValue。
第二種策略是每個類一張表,保存所有信息:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator( //一個類一張表,最重要的是要保證它們的id由一個生成器產(chǎn)生,@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不重復(fù)
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;
}
}
采用表連接的情況,還是每個類擁有自己的一張表,只是子類對應(yīng)的表只保存子類的信息,其父類的信息由父類的表保存。當(dāng)需要獲取子類的完整信息時通過表連接的方式連接子類的表和父類的表獲取對應(yīng)信息??梢栽谧宇惖谋砩蠘?biāo)注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子類表相對于父類表外鍵的名稱。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
您可能感興趣的文章:- 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)
- 基于Hibernate中配置文件的學(xué)習(xí)(分享)
- 詳解 hibernate mapping配置
- Spring Boot + Jpa(Hibernate) 架構(gòu)基本配置詳解
- java中hibernate二級緩存詳解
- Hibernate對數(shù)據(jù)庫刪除、查找、更新操作實例代碼
- 深入理解hibernate的三種狀態(tài)
- 詳解hibernate自動創(chuàng)建表的配置