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

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

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

    Kira-2006
    -僅僅是一陣風(fēng)也罷了,偏偏是這樣永恒, 僅僅是一場夢也罷了,偏偏是如此的真實,
    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)前主鍵上存在一個約束。
       
        測試代碼:
    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é)點被設(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表同時讀入,因為此時將out-join=“true”。若設(shè)置為false,則會分開讀取兩個表。

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

    雙向多對一關(guān)聯(lián)
        實際上是“一對多”與“多對一”關(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è)計中應(yīng)該避免大量使用。同時,在多對多關(guān)系中,應(yīng)根據(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ù)的情況,如刪除一個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)時必須對雙方同時保存。
    posted on 2008-05-10 20:08 Kira-2006 閱讀(555) 評論(0)  編輯  收藏 所屬分類: hibernate
    主站蜘蛛池模板: 亚洲国产成人99精品激情在线| 国产亚洲AV夜间福利香蕉149| 777亚洲精品乱码久久久久久| 久久免费动漫品精老司机| 亚洲AV无码精品色午夜在线观看| 国产成人 亚洲欧洲| 午夜时刻免费入口| 97se亚洲国产综合自在线| 久久不见久久见中文字幕免费| 久久精品国产亚洲AV高清热 | 亚洲色大成网站www久久九| 97在线线免费观看视频在线观看 | 无码毛片一区二区三区视频免费播放 | 国语成本人片免费av无码| 亚洲资源最新版在线观看| 一个人在线观看视频免费| 亚洲中文字幕无码久久2020| 成年美女黄网站色大免费视频| 亚洲熟妇少妇任你躁在线观看| 日本高清免费不卡在线| 产传媒61国产免费| 亚洲成AV人片天堂网无码| 亚洲精品视频在线免费| 亚洲日韩精品无码专区加勒比| 尤物永久免费AV无码网站| 一区二区视频在线免费观看| 亚洲人成亚洲人成在线观看| 57pao国产成永久免费视频| 亚洲H在线播放在线观看H| 国产在线不卡免费播放| 好吊色永久免费视频大全| 亚洲AV成人片色在线观看高潮| 无码av免费毛片一区二区| 亚洲av无一区二区三区| 国产啪亚洲国产精品无码| 97精品免费视频| 亚洲GV天堂GV无码男同| 日韩精品亚洲aⅴ在线影院| 国产大片91精品免费观看不卡| 日日摸日日碰夜夜爽亚洲| 亚洲国产精品福利片在线观看|