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