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

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

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

    隨筆-10  評論-22  文章-1  trackbacks-0

    在域模型(實(shí)體域)中,關(guān)聯(lián)關(guān)系是類與類之間最普遍的關(guān)系。根據(jù)UML語言,關(guān)系是有方向的。下面以客戶(Customer)和訂單(Order)的關(guān)系為例,闡述一下ORM的中的一對多映射:
    我們知道,在關(guān)系數(shù)據(jù)庫中,只存在外鍵參照關(guān)系,而且總是由“many”方參照“one“方。
    1.建立多對一單向關(guān)聯(lián)——Order(many)--->Customer(one):
    -------------------------------Order.java--------------------------------

    pack mypack;
    import java.io.Serializable;
    public class Order implements Serializable{
       
    private int id;
       
    private String orderNumber;
       
    private Customer customer;
       
       
    //構(gòu)造方法及set方法get方法
       
    }
    在以上代碼中customer屬性要使用<many-to-one>來映射:
    多對一單向關(guān)聯(lián)(many方)
    <many-to-one>
        name 
    = "customer"   --待映射的持久化類屬性名
        column 
    = "customer_Id"  --數(shù)據(jù)庫外鍵字段
        
    class = "mypack.Customer"  --持久化類
        not
    -null = "true"/>
    a.  <many-to-one>的not-null屬性 
    not-null屬性會影響Hiberntae的運(yùn)行時行為,Hibernate在保存Order對象時,會先檢查它的customer屬性是否為null:
    若為null:在執(zhí)行session.save(Order)時會拋出PropertyValueException異常;
    原因很簡單:既然Customer為null,那么對應(yīng)的外鍵Customer_Id也為null,試問外鍵都沒有,Order表的數(shù)據(jù)能插得進(jìn)去嗎
    若將not-null 屬性設(shè)為false:表示外鍵引用可以為null,試想一下,數(shù)據(jù)庫數(shù)據(jù)可以插進(jìn)去嗎?
    我們來看:在執(zhí)行session.save(Order)時,發(fā)出了sql語句:insert into......
    但是當(dāng)Hibernate自動清理(flush)緩存時,拋出新的異常:TransientObjectException
    所謂清理是提交事務(wù)或手動Flush,將session與數(shù)據(jù)庫保持同步,很顯然不可能同步嘛,Order對象雖然持久化,但Customer沒有.
        注:是否應(yīng)該把<many-to-one>的not-null屬性設(shè)為true,這根據(jù)實(shí)際業(yè)務(wù)而定。通常,訂單總是由客戶自己發(fā)出,因此建議設(shè)為true.
    b.  級聯(lián)保存與更新
    默認(rèn)情況下,Hibernate持久化一個對象,不會自動持久化所關(guān)聯(lián)的其它臨時對象,因此會有TransientObjectException,
    想它關(guān)聯(lián)也可以,<many-to-one>中加個屬性cascade="save-update"即可.

    2.建立一對多關(guān)聯(lián)——Customer(one)--->Order(many):
    -----------------------------Customer.java-------------------------------
    package mypack;
    import 
    public calss Customer implements Serlizliab;e{
        
    private int id;
        
    private String name;
        
    private Set orders = new HsahSet();

        
    //構(gòu)造方法及set方法get方法
    }
    一對多關(guān)聯(lián)(one方)
    <set 
          name 
    = "orders"  --持久化對象的屬性
          cascade 
    = "save-update" --級聯(lián)操作
          
    <key cloumn = "customer_Id"/> --外鍵
          
    <one-to-many class = "mypack.Order"/> --持久化類
    </set>
    a.  <set>元素的inverse屬性
      在映射一對多的雙向關(guān)聯(lián)時,應(yīng)該在“one”方把inverse屬性設(shè)為true,這樣可提高應(yīng)用性能。
                        inverse:控制反轉(zhuǎn),為true表示反轉(zhuǎn),由它方負(fù)責(zé);反之,不反轉(zhuǎn),自己負(fù)責(zé);
                        如果不設(shè),one和many兩方都要負(fù)責(zé)控制,因此,會引發(fā)重復(fù)的sql語句以及重復(fù)添加數(shù)據(jù),
            在建立兩個象的雙向關(guān)系時,應(yīng)該同時修改關(guān)聯(lián)兩端的對象屬性:
                        customer.getOrders().add(order);
                        order.setCustomer(customer);

            這樣做可提高業(yè)務(wù)邏輯的獨(dú)立性,使業(yè)務(wù)邏輯的程序代碼不受Hibernate實(shí)現(xiàn)的影響。同理解除雙向關(guān)系也一樣。
    b.  級聯(lián)刪除(從數(shù)據(jù)庫刪除相關(guān)表記錄)
             當(dāng)刪除Customer對象時,及聯(lián)刪除Order對象.只需將cascad屬性設(shè)為delete即可.
              注:刪除后的對象,依然存在于內(nèi)存中,只不過由持久化態(tài)變?yōu)榕R時態(tài).
    c.  父子關(guān)系(邏輯刪除,只是解除了關(guān)聯(lián)關(guān)系)
             自動刪除不再和Customer對象關(guān)聯(lián)的Order對象.只需將cascade屬性設(shè)為delete-orphan.
                         customer.getOrders().remove(order);
                         order.setCustomer(null);
              注:當(dāng)關(guān)聯(lián)雙方都存在父子關(guān)系,就可以把父方的cascade屬性設(shè)為delete-orphan,所謂父子關(guān)系,是由父方來控制子方的生命周期.
                         
           


    posted on 2009-10-16 00:29 獨(dú)孤行 閱讀(3347) 評論(2)  編輯  收藏 所屬分類: Hibernate

    評論:
    # re: 精通Hibernate——映射一對多關(guān)聯(lián)關(guān)系 2009-10-18 20:26 | 夢芭莎女性內(nèi)衣
    應(yīng)該同時修改關(guān)聯(lián)兩端的對象屬性  回復(fù)  更多評論
      
    # re: 精通Hibernate——映射一對多關(guān)聯(lián)關(guān)系 2009-10-20 03:31 | 美容
    精通Hibernate——映射一對多關(guān)聯(lián)關(guān)系 good  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 1000部拍拍拍18免费网站| 99视频精品全部免费观看| 看全色黄大色大片免费久久| 亚洲天堂2016| 搡女人真爽免费视频大全| 亚洲熟伦熟女专区hd高清| 成人毛片视频免费网站观看| 亚洲国产欧美一区二区三区| 日产乱码一卡二卡三免费| 国产成人亚洲精品播放器下载 | 美女视频黄a视频全免费| 日韩亚洲人成在线| 国产裸模视频免费区无码| 国产成人亚洲精品蜜芽影院| 中文字幕亚洲不卡在线亚瑟| 国产麻豆一精品一AV一免费| 久久国产精品亚洲一区二区| 人与禽交免费网站视频| 亚洲精品无码专区久久| 亚洲欧洲自拍拍偷精品 美利坚| a级毛片毛片免费观看永久| 亚洲福利视频导航| 少妇高潮太爽了在线观看免费| 亚洲成a人片在线不卡一二三区| 免费在线观看污网站| a级在线免费观看| 亚洲三级在线免费观看| 午夜亚洲av永久无码精品| 最近免费mv在线观看动漫 | 亚洲视屏在线观看| 日韩在线视频免费看| 两个人看的www高清免费观看| 亚洲免费网站在线观看| 亚洲国产精品毛片av不卡在线| 午夜视频在线免费观看| 亚洲国产精品无码久久九九大片| 亚洲人成网站观看在线播放| 91精品国产免费入口| 美女隐私免费视频看| 亚洲精品人成电影网| 国产精品亚洲高清一区二区|