Hibernate實(shí)體對(duì)象繼承的三種方法
Hibernate實(shí)體對(duì)象繼承的方法
hibernate繼承策略總共有三種,一種是共用一張表;一種是每個(gè)類(lèi)一張表,表里面儲(chǔ)存子類(lèi)的信息和父類(lèi)的信息;還有一種是通過(guò)表連接的方式,每個(gè)類(lèi)都有一張表,但是子類(lèi)對(duì)應(yīng)的表只保存自己的信息,父類(lèi)對(duì)應(yīng)的表保存父類(lèi)的信息,它們之間通過(guò)子類(lèi)表和父類(lèi)表的關(guān)聯(lián)來(lái)獲取所有的信息。
第一種方式,即共用一張表:
@Entity
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="discriminator", discriminatorType=DiscriminatorType.STRING)//表示區(qū)分不同的對(duì)象的字段名
@DiscriminatorValue("person")//用來(lái)表示該對(duì)象是何種對(duì)象的,即區(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;
}
}
這種情況父類(lèi)和所有子類(lèi)的所有信息都保存在同一張表里面,通過(guò)我們指定的@DiscriminatorColumn對(duì)應(yīng)的@DiscriminatorValue來(lái)區(qū)別不同的類(lèi)。 當(dāng)沒(méi)有指定@DiscriminatorValue的時(shí)候?qū)⑹褂萌?lèi)名來(lái)作為DiscriminatorValue。
第二種策略是每個(gè)類(lèi)一張表,保存所有信息:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@TableGenerator( //一個(gè)類(lèi)一張表,最重要的是要保證它們的id由一個(gè)生成器產(chǎn)生,@TableGenerator就是為了控制這個(gè)的
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)//這個(gè)就是用表生成器生成的,用同一個(gè)生成器就可以控制它們的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;
}
}
采用表連接的情況,還是每個(gè)類(lèi)擁有自己的一張表,只是子類(lèi)對(duì)應(yīng)的表只保存子類(lèi)的信息,其父類(lèi)的信息由父類(lèi)的表保存。當(dāng)需要獲取子類(lèi)的完整信息時(shí)通過(guò)表連接的方式連接子類(lèi)的表和父類(lèi)的表獲取對(duì)應(yīng)信息??梢栽谧宇?lèi)的表上標(biāo)注@PrimaryKeyJoinColumn(name="foreignKeyName")指明子類(lèi)表相對(duì)于父類(lèi)表外鍵的名稱。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
JSP實(shí)現(xiàn)簡(jiǎn)單人事管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了JSP實(shí)現(xiàn)簡(jiǎn)單人事管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01
Jdbc連Sybase數(shù)據(jù)庫(kù)的幾種方法
Jdbc連Sybase數(shù)據(jù)庫(kù)的幾種方法...2006-10-10
JSP使用Servlet過(guò)濾器進(jìn)行身份驗(yàn)證的方法
這篇文章主要介紹了JSP使用Servlet過(guò)濾器進(jìn)行身份驗(yàn)證的方法,結(jié)合實(shí)例形式分析了Servlet過(guò)濾器的實(shí)現(xiàn)方法及jsp身份驗(yàn)證的具體使用技巧,需要的朋友可以參考下2015-12-12
JSP數(shù)據(jù)庫(kù)操作例程(Use Bean)
JSP數(shù)據(jù)庫(kù)操作例程(Use Bean)...2006-10-10
XML到Java代碼的數(shù)據(jù)綁定之對(duì)象
XML到Java代碼的數(shù)據(jù)綁定之對(duì)象...2006-10-10
JSP中使用JDBC訪問(wèn)SQL Server 2008數(shù)據(jù)庫(kù)示例
這篇文章主要介紹了JSP中使用JDBC訪問(wèn)SQL Server 2008數(shù)據(jù)庫(kù)示例,本文重點(diǎn)在JSP代碼示例中,需要的朋友可以參考下2014-09-09
JAVA/JSP學(xué)習(xí)系列之七(Orion下自定義Tag)
JAVA/JSP學(xué)習(xí)系列之七(Orion下自定義Tag)...2006-10-10

