程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2EE >> hibernate annoation (七 繼承映射)

hibernate annoation (七 繼承映射)

編輯:J2EE

Table per Class Strategy: the <union-class> element in Hibernate

Single Table per Class HIErarchy Strategy: the <subclass> element in Hibernate

Joined Subclass Strategy: the <joined-subclass> element in Hibernate

ejb支持三種映射關系

1,每個類一張表 (hibertnate裡對應<union-class>)

2,每個類層次一張表 (在 hibernate裡對應<subclass>)

3,連接的子類(對應join-subclass)

目前不支持在接口上進行注解

(1)每個類一張表:

在父類class-level上設置:@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)

例如:

Java代碼

class A代碼:
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public class A {
 
 private int id;
 private String aname;
 @Id 
 @GeneratedValue(strategy=GenerationType.IDENTITY)
 public int getId() {
 return id;
 } 
 public void setId(int id) {
 this.id = id;
 } 
 public String getAname() {
 return aname;
 } 
 public void setAname(String aname) {
 this.aname = aname;
 } 
 
} 
 
class B extends A代碼:
@Entity
public class B extends A{
 
 private String bname;
 
 public String getBname() {
 return bname;
 } 
 
 public void setBname(String bname) {
 this.bname = bname;
 } 
 
} 
class C extends A代碼:
@Entity 
public class C extends A{
 
 private String cname;
 
 
 public String getCname() {
 return cname;
 } 
 
 public void setCname(String cname) {
 this.cname = cname;
 } 
 
 
} 


最終生成sql語句:

Java代碼

create table A (id integer not null auto_increment, aname varchar(255), primary key (id))
create table B (id integer not null, aname varchar(255), bname varchar(255), primary key (id))
create table C (id integer not null, aname varchar(255), cname varchar(255), primary key (id)) 

B 和 C 都繼承了A但是沒有關聯

(2)每個類層次一張表:也就是所有繼承的類和父類共享一張表 通過一個辨別符號進行區分

這需要在父類上使用:@Inheritance(strategy=InheritanceType.SINGLE_TABLE)

這樣的話在表裡面會多出一個字段:DTYPE(默認 默認值為entry.class)

可以通過在父類class-level上設置

@DiscriminatorColumn(name="mytype",discriminatorType=DiscriminatorType.STRING)

在之類上使用

例如:

@Entity

@DiscriminatorValue(value="ctype")

插入數據時候將會有下列語句產生:Hibernate: insert into A (aname, cname, mytype) values (?, ?, 'ctype');

(3)每個字類一張表:也就是字類的關聯到父類的主鍵

通過在父類上使用:@Inheritance(strategy=InheritanceType.JOINED)

產生語句:默認id關聯

Java代碼

 create table A (id integer not null auto_increment, aname varchar(255), primary key (id))
 create table B (bname varchar(255), id integer not null, primary key (id))
 create table C (cname varchar(255), id integer not null, primary key (id))
 alter table B add index FK42FCA55807 (id), add constraint FK42FCA55807 foreign key (id) references A (id)
 alter table C add index FK43FCA55807 (id), add constraint FK43FCA55807 foreign key (id) references A (id)

也可以指定關聯 例如:在B的class-level上使用@PrimaryKeyJoinColumn(name="bid")

生成sql語句:

Java代碼

create table B (bname varchar(255), bid integer not null, primary key (bid))
alter table B add index FK42FCA6C7E9 (bid), add constraint FK42FCA6C7E9 foreign key (bid) references A (id)

但是我們不能關聯到A的非主鍵字段例如:

在B上使用

@PrimaryKeyJoinColumn(name="bid",referencedColumnName="aname")則會報錯:SecondaryTable JoinColumn cannot reference a non primary key

當然也可以給之類關聯設置不同的類型例如:@PrimaryKeyJoinColumn(name="bid",columnDefinition="carchar(20)")但是不能設置不能轉換的類型例如:

@PrimaryKeyJoinColumn(name="bid",columnDefinition="blob")則會建立不了關聯

(4)從實體繼承 但是父類不持久化:使用@MappedSuperclass

sql語句:

Java代碼

create table B (id integer not null auto_increment, aname varchar(255), bname varchar(255), primary key (id))
create table C (id integer not null auto_increment, aname varchar(255), cname varchar(255), primary key (id))

當然可以使用@AttributeOverride或者@AssociationOverride進行覆蓋

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved