<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
    主站蜘蛛池模板: 免费观看美女裸体网站| 亚洲综合色自拍一区| 十八禁视频在线观看免费无码无遮挡骂过 | 亚洲人成网亚洲欧洲无码| 久久精品夜色国产亚洲av| 亚洲毛片网址在线观看中文字幕| 免费看国产精品3a黄的视频| 麻豆精品成人免费国产片| 九九九国产精品成人免费视频| 亚洲色大18成人网站WWW在线播放| 亚洲avav天堂av在线不卡| 亚洲国产精品一区二区第一页免| 欧洲精品免费一区二区三区| 国产成人福利免费视频| 久久精品私人影院免费看| 国产一级婬片A视频免费观看| 久久精品国产亚洲AV未满十八 | 最近最新的免费中文字幕| 99精品视频免费观看| 久久国产精品成人免费| 美女巨胸喷奶水视频www免费| 乱人伦中文视频在线观看免费| 亚洲成a∧人片在线观看无码| 在线aⅴ亚洲中文字幕| 国产成人精品亚洲2020| 亚洲欧洲另类春色校园小说| 久久99亚洲网美利坚合众国 | 国产成人yy免费视频| 最近2022中文字幕免费视频| 久久国产乱子伦精品免费看| 国产羞羞的视频在线观看免费| 中文字幕免费不卡二区| 久久福利青草精品资源站免费| 国产精品免费一区二区三区四区| 国产羞羞的视频在线观看免费| 无码专区AAAAAA免费视频| 精品一区二区三区无码免费视频 | 亚洲AV无码一区东京热| 亚洲国产美女精品久久久久∴| 国产亚洲美女精品久久久久狼| 亚洲AV无码专区在线播放中文|