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支持三種映射關(guān)系
1,每個(gè)類一張表 (hibertnate里對(duì)應(yīng)<union-class>)
2,每個(gè)類層次一張表 (在 hibernate里對(duì)應(yīng)<subclass>)
3,連接的子類(對(duì)應(yīng)join-subclass)
目前不支持在接口上進(jìn)行注解
(1)每個(gè)類一張表:
在父類class-level上設(shè)置:@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
例如:
- 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;
- }
-
-
- }
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語句:
- 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))
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但是沒有關(guān)聯(lián)
(2)每個(gè)類層次一張表:也就是所有繼承的類和父類共享一張表 通過一個(gè)辨別符號(hào)進(jìn)行區(qū)分
這需要在父類上使用:@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
這樣的話在表里面會(huì)多出一個(gè)字段:DTYPE(默認(rèn) 默認(rèn)值為entry.class)
可以通過在父類class-level上設(shè)置
@DiscriminatorColumn(name="mytype",discriminatorType=DiscriminatorType.STRING)
在之類上使用
例如:
@Entity
@DiscriminatorValue(value="ctype")
插入數(shù)據(jù)時(shí)候?qū)?huì)有下列語句產(chǎn)生:Hibernate: insert into A (aname, cname, mytype) values (?, ?, 'ctype');
(3)每個(gè)字類一張表:也就是字類的關(guān)聯(lián)到父類的主鍵
通過在父類上使用:@Inheritance(strategy=InheritanceType.JOINED)
產(chǎn)生語句:默認(rèn)id關(guān)聯(lián)
- 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)
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)
也可以指定關(guān)聯(lián) 例如:在B的class-level上使用@PrimaryKeyJoinColumn(name="bid")
生成sql語句:
- 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)
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)
但是我們不能關(guān)聯(lián)到A的非主鍵字段例如:
在B上使用
@PrimaryKeyJoinColumn(name="bid",referencedColumnName="aname")則會(huì)報(bào)錯(cuò):SecondaryTable JoinColumn cannot reference a non primary key
當(dāng)然也可以給之類關(guān)聯(lián)設(shè)置不同的類型例如:@PrimaryKeyJoinColumn(name="bid",columnDefinition="carchar(20)")但是不能設(shè)置不能轉(zhuǎn)換的類型例如:
@PrimaryKeyJoinColumn(name="bid",columnDefinition="blob")則會(huì)建立不了關(guān)聯(lián)
(4)從實(shí)體繼承 但是父類不持久化:使用@MappedSuperclass
sql語句:
- 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))
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))
當(dāng)然可以使用@AttributeOverride或者@AssociationOverride進(jìn)行覆蓋