<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 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    hibernate annoation (七 繼承映射)

    Posted on 2009-11-02 14:54 瘋狂 閱讀(2159) 評論(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支持三種映射關系
    1,每個類一張表 (hibertnate里對應<union-class>)
    2,每個類層次一張表 (在 hibernate里對應<subclass>)
    3,連接的子類(對應join-subclass)

       目前不支持在接口上進行注解
    (1)每個類一張表:
    在父類class-level上設置:@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
    例如:

    Java代碼 復制代碼
    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代碼 復制代碼
    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但是沒有關聯

    (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代碼 復制代碼
    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)  

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

    Java代碼 復制代碼
    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)  

     
    但是我們不能關聯到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代碼 復制代碼
    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))  

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

    主站蜘蛛池模板: 国产又大又黑又粗免费视频| 老司机在线免费视频| 免费一级国产生活片| 黄色免费在线网址| 亚洲AⅤ永久无码精品AA| 亚洲成人免费在线观看| 久久精品国产亚洲AV电影| 国产在线观看麻豆91精品免费| 亚洲人色大成年网站在线观看| 国产福利在线免费| 亚洲AV无码一区二区三区网址| 国产乱子伦精品免费女| 一级一片免费视频播放| 亚洲AV无码乱码国产麻豆| 永久黄色免费网站| 亚洲精品乱码久久久久蜜桃| 免费在线观看污网站| 男女一边桶一边摸一边脱视频免费 | 国产成人涩涩涩视频在线观看免费| 国产成人亚洲精品无码AV大片| 亚洲av再在线观看| 免费高清国产视频| 亚洲七久久之综合七久久| 亚洲国产精品国产自在在线| 无码日韩精品一区二区免费暖暖 | 国产又大又粗又长免费视频| 亚洲国产午夜精品理论片在线播放| 国产精品免费_区二区三区观看 | 久久福利资源网站免费看| 亚洲av永久中文无码精品综合| 亚洲乱码中文字幕综合234 | 久久国产精品成人片免费| 在线观看亚洲AV每日更新无码| 免费真实播放国产乱子伦| 日韩精品无码专区免费播放| 亚洲xxxx视频| 国产亚洲人成网站在线观看不卡 | 成人免费777777被爆出| 亚洲大香伊人蕉在人依线| 亚洲综合亚洲综合网成人| 97免费人妻无码视频|