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進行覆蓋