<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    hibernate annoation (七 繼承映射)

    Posted on 2009-11-02 14:54 瘋狂 閱讀(2160) 評(píng)論(0)  編輯  收藏 所屬分類: hibernate

    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)
    例如:

    Java代碼 復(fù)制代碼
    1. class A代碼:   
    2. @Entity  
    3. @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)   
    4. public class A {   
    5.   
    6.  private int id;   
    7.  private String aname;   
    8.  @Id  
    9.  @GeneratedValue(strategy=GenerationType.IDENTITY)   
    10.  public int getId() {   
    11.   return id;   
    12.  }   
    13.  public void setId(int id) {   
    14.   this.id = id;   
    15.  }   
    16.  public String getAname() {   
    17.   return aname;   
    18.  }   
    19.  public void setAname(String aname) {   
    20.   this.aname = aname;   
    21.  }   
    22.     
    23. }   
    24.   
    25. class B extends A代碼:   
    26. @Entity  
    27. public class B extends A{   
    28.   
    29.  private String bname;   
    30.   
    31.  public String getBname() {   
    32.   return bname;   
    33.  }   
    34.   
    35.  public void setBname(String bname) {   
    36.   this.bname = bname;   
    37.  }   
    38.     
    39. }   
    40. class C extends A代碼:   
    41. @Entity  
    42. public class C extends A{   
    43.   
    44.  private String cname;   
    45.   
    46.   
    47.  public String getCname() {   
    48.   return cname;   
    49.  }   
    50.   
    51.  public void setCname(String cname) {   
    52.   this.cname = cname;   
    53.  }   
    54.   
    55.     
    56. }  

     

    最終生成sql語句:

    Java代碼 復(fù)制代碼
    1. create table A (id integer not null auto_increment, aname varchar(255), primary key (id))   
    2. create table B (id integer not null, aname varchar(255), bname varchar(255), primary key (id))   
    3. 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)

    Java代碼 復(fù)制代碼
    1. create table A (id integer not null auto_increment, aname varchar(255), primary key (id))   
    2. create table B (bname varchar(255), id integer not null, primary key (id))   
    3. create table C (cname varchar(255), id integer not null, primary key (id))   
    4. alter table B add index FK42FCA55807 (id), add constraint FK42FCA55807 foreign key (id) references A (id)   
    5. 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語句:

    Java代碼 復(fù)制代碼
    1. create table B (bname varchar(255), bid integer not null, primary key (bid))   
    2. 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語句:

    Java代碼 復(fù)制代碼
    1. create table B (id integer not null auto_increment, aname varchar(255), bname varchar(255), primary key (id))   
    2. create table C (id integer not null auto_increment, aname varchar(255), cname varchar(255), primary key (id))  

     
     當(dāng)然可以使用@AttributeOverride或者@AssociationOverride進(jìn)行覆蓋

    主站蜘蛛池模板: 亚洲精品制服丝袜四区| 一个人免费观看视频在线中文| av在线亚洲欧洲日产一区二区| jjizz全部免费看片| 久青草视频在线观看免费| 亚洲欧洲免费无码| 中国人免费观看高清在线观看二区| 亚洲中文字幕日本无线码| 亚洲国产成人久久精品影视| 国产午夜亚洲精品理论片不卡| 拔擦拔擦8x华人免费久久| 国国内清清草原免费视频99 | 成人人免费夜夜视频观看| 美女视频黄a视频全免费网站色窝| 女bbbbxxxx另类亚洲| 亚洲国产成人AV在线播放| 亚洲丝袜中文字幕| 亚洲精品在线免费看| 亚洲av日韩av天堂影片精品| 亚洲综合日韩久久成人AV| 亚洲精品麻豆av| 四虎影视精品永久免费| 日韩精品视频免费网址| 日本免费一区二区三区最新| 最近免费中文字幕视频高清在线看 | 亚洲人成电影网站色www| 亚洲国产亚洲片在线观看播放| 久久精品7亚洲午夜a| 国产亚洲精品一品区99热| 亚洲一区AV无码少妇电影☆| 国产亚洲日韩在线三区| 久久久久亚洲av成人无码电影 | jizz日本免费| 一级毛片免费不卡直观看| 一级毛片试看60分钟免费播放| 野花视频在线官网免费1| 美女羞羞免费视频网站| 日本一区二区在线免费观看| 日韩毛片在线免费观看| 人妻18毛片a级毛片免费看| 一级特黄色毛片免费看|