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

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

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

    Kira-2006
    -僅僅是一陣風(fēng)也罷了,偏偏是這樣永恒, 僅僅是一場夢也罷了,偏偏是如此的真實(shí),
    posts - 4,comments - 7,trackbacks - 0

    一對一關(guān)聯(lián)
        主鍵關(guān)聯(lián):
    即兩張表通過主鍵形成一對一映射關(guān)系。

        用戶TUser與護(hù)照TPassport關(guān)聯(lián)
        TUer.hbm.xml
        
    <hibernate-mapping>
    <class
        
    name="TUser"
        table
    ="T_User">
        
        
    <one-to-one 
            
    name="passport"
            class
    ="TPassport"
            cascade
    ="all"
            outer-join
    ="true"/>
        
    </class>
    </hibernate-mapping>
    cascade="all"表示級聯(lián)關(guān)系設(shè)置為“all”,即無論主空房執(zhí)行任何操作,都會關(guān)聯(lián)類執(zhí)行相同的操作。

        TPassport.hbm.xml
    <hibernate-mapping>
    <class
        
    name="TPassport"
        table
    ="T_Passport">
        
    <one-to-one
            
    name="user"
            class
    ="TUser"
            constrain
    ="true">
        .
    </class>
    </hibernate-mapping>

        
    constrain必須設(shè)定為“true”,以告知Hibernate當(dāng)前主鍵上存在一個(gè)約束。
       
        測試代碼:
    TUser user = new TUser();
    user.setAge(
    new Integer(20));
    user.setName(
    "Carin");

    TPassport passport 
    = new TPassport();
    passport.setSerial(
    "PCN759386");
    passport.setExpiry(
    new Integer(20080101));

    //相互設(shè)置關(guān)聯(lián)
    passport.setUser(user);
    user.setPassport(passport);

    Transaction tx 
    = sessioin.beginTransaction();
    //由于TUser類的one-to-one節(jié)點(diǎn)被設(shè)置成
    //cascade=“all”其關(guān)聯(lián)的passport對象將被級聯(lián)保存
    session.save(user);

    tx.commit();
        以下代碼完成關(guān)聯(lián)對象的讀取:
    TUser user=(TUser)Hibernate.load(TUser.class,new Integer(15));
    System.out.println(
    "User name=>"+user.getName());
    System.out.println(
    "Passport Serial=>"+user.getPassport().getSerial());
        控制臺輸出:
    Hibernate:select tuser0_.id as id1_,
    from T_USER tuser0_
    left outer join
    T_PASSPORT tpassport1_ on tuser0_.id
    =tpassport1_.id
    where tuser0_.id
    =?
    User name
    =>Carin
    Passport Serial
    =>PCN759386
    Hibernate通過left outer join將T_User表及其關(guān)聯(lián)的T_Passport表同時(shí)讀入,因?yàn)榇藭r(shí)將out-join=“true”。若設(shè)置為false,則會分開讀取兩個(gè)表。

    一對多關(guān)聯(lián)
        用戶TUser和地址TAddress的一對多關(guān)聯(lián)。
        單向一對多關(guān)聯(lián)
            主控方TUser的映射配置:
    <hibernate-mapping>
    <class
        
    name="TUser"
        table
    ="t_user"
        dynamic-update
    ="true"
        dynamic-insert
    ="true">
    .
        
    <set
            
    name="address"
            table
    ="t_address"
            cascade
    ="all"
            order-by
    ="zipcode asc">
            
    <key column="user_id"/>
            
    <one-to-many class="TAddress">
        
    </set>

    </class>
    </hibernate>
    被動(dòng)方TAddress的記錄由Hibernate負(fù)責(zé)讀取,之后存放在主控方TUser指定的Collection類型屬性中。
    單向一對多的實(shí)現(xiàn)比較簡單,但是存在一個(gè)問題,由于是單向關(guān)聯(lián),為了保持關(guān)聯(lián)關(guān)系,我們只能通過主控方對被動(dòng)方進(jìn)行級聯(lián)更新。如果被關(guān)聯(lián)方的關(guān)聯(lián)字段為“NOT NULL”,當(dāng)Hibernate創(chuàng)建或者更新時(shí),可能出現(xiàn)約束違例。

    雙向多對一關(guān)聯(lián)
        實(shí)際上是“一對多”與“多對一”關(guān)聯(lián)的組合。也就是說我們必須在主控方配置一對多關(guān)系的基礎(chǔ)上,在被控方配置與其對應(yīng)的多對一關(guān)聯(lián)。
        TUser.hbm.xml
    <hibernate-mapping>
    <class
        
    name="TUser"
        table
    ="t_user"
        dynamic-update
    ="true"
        dynamic-insert
    ="true">
    .
        
    <set
            
    name="address"
            table
    ="t_address"
            lazy
    ="false"
            inverse
    ="true"
            cascade
    ="all"
            sort
    ="unsorted"
            order-by
    ="zipcode asc">
            
    <key column="user_id"/>
            
    <one-to-many class="TAddress"/>
        
    </set>
    .
    </class>
    </hibernate>
    inverse="true",TUser不在作為主控方,而是將關(guān)聯(lián)關(guān)系的維護(hù)工作交給關(guān)聯(lián)對象TAddress來做。
    在one-to-many關(guān)系中,將many一方設(shè)置為主控方(inverse=“true”)將有助于性能的改善。
        TAddress.hbm.xml
    <hibernat-mapping>
    <class
        
    name="TAddress"
        table
    ="t_address"
        dynamic-update
    ="false"
        dynamic-insert
    ="false">
    .
        
    <many-to-one
            
    name="user"
            class
    ="TUser"
            cascade
    ="none"
            outer-join
    ="auto"
            update
    ="true"
            insert
    ="true"
            access
    ="property"
            column
    ="user_id"
            not-null
    ="true"/>
    .
    </class>
    </hibernate-mapping>

    多對多關(guān)聯(lián)
    需要借助中間表來完成多對多映射信息的保存。
        由于多對多關(guān)聯(lián)的性能不佳(由于引入了中間表,一次讀取操作需要反復(fù)多次查詢),因此在設(shè)計(jì)中應(yīng)該避免大量使用。同時(shí),在多對多關(guān)系中,應(yīng)根據(jù)情況,采取延遲加載機(jī)制來避免無謂的性能開銷。
        TGroup與TRole的多對多關(guān)聯(lián):
        TGroup.hbm.xml:
    <hibernate-mapping>
    <class
        
    name="TGroup"
        table
    ="t_group"
        dynamic-update
    ="false"
        dynamic-insert
    ="false">
    .
        
    <set
            
    name="roles"
            table
    ="t_group_role"
            lazy
    ="false"
            inverse
    ="false"
            cascade
    ="save-update">
            
    <key column="group_id"/>
            
    <many-to-many
                
    class="TRole"
                column
    ="role_id"/>
        
    </set>
    .
    </class>
    </hibernate>
    t_group_role為t_group與t_role之間的映射表,它保存了group和role之間的映射關(guān)系。
    cascade=“save-update”,對于多對多邏輯而言,很少出現(xiàn)刪除一方需要級聯(lián)刪除所有關(guān)聯(lián)數(shù)據(jù)的情況,如刪除一個(gè)group,一般不會刪除其中包含的Role。
    column=“group_id”映射表中對于t_group表記錄的標(biāo)識字段。
     
        TRole.hbm.xml:
    <hibernate-mapping>
    <class
        
    name="TRole"
        table
    ="t_role"
        dynamic-update
    ="false"
        dynamic-insert
    ="false">
    .
        
    <set
            
    name="groups"
            table
    ="t_group_role"
            lazy
    ="false"
            inverse
    ="true"
            cascade
    ="save-update"
            sort
    ="unsorted">
            
    <key column="role_id"/>
            
    <many-to-many 
                
    class="TGroup"
                column
    ="group_id"
                outer-join
    ="auto"/>
        
    </set>
    .
    </class>
    </hibernate>
    多對多關(guān)系中,由于關(guān)聯(lián)關(guān)系是兩張表相互引用,因此在保存關(guān)聯(lián)狀態(tài)時(shí)必須對雙方同時(shí)保存。
    posted on 2008-05-10 20:08 Kira-2006 閱讀(549) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 中文字幕亚洲乱码熟女一区二区 | 亚洲图片校园春色| 日本免费污片中国特一级| 国产精品亚洲美女久久久| 国产成人高清亚洲一区久久| 免费看美女让人桶尿口| 亚洲欧美黑人猛交群| 日韩成全视频观看免费观看高清| 亚洲一区二区三区深夜天堂| 免费大片黄在线观看yw| 亚洲娇小性xxxx| 99久久免费精品国产72精品九九| 亚洲国产成人精品激情| 热久久精品免费视频| 国产精品亚洲а∨无码播放不卡| 婷婷亚洲天堂影院| 999zyz**站免费毛片| 日本久久久久亚洲中字幕| 西西大胆无码视频免费| 国产成人亚洲综合在线| 亚洲中文字幕视频国产| 99视频在线免费| 亚洲www在线观看| 全亚洲最新黄色特级网站 | 亚洲精品少妇30p| 57pao国产成永久免费视频| 亚洲精品无码久久| 亚洲AV无码乱码在线观看| 国产大片91精品免费看3 | 精品一区二区三区免费视频| 久久99国产亚洲精品观看| 台湾一级毛片永久免费| 午夜亚洲乱码伦小说区69堂| 亚洲国产精品无码久久一区二区| 最近中文字幕mv免费高清视频8| 亚洲精品无码专区在线播放| 亚洲色欲久久久久综合网| 8x8x华人永久免费视频| 色欲色欲天天天www亚洲伊| 亚洲国产精品无码久久一区二区| 久久国内免费视频|