<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

    在域模型(實體域)中,關聯關系是類與類之間最普遍的關系。根據UML語言,關系是有方向的。下面以客戶(Customer)和訂單(Order)的關系為例,闡述一下ORM的中的一對多映射:
    我們知道,在關系數據庫中,只存在外鍵參照關系,而且總是由“many”方參照“one“方。
    1.建立多對一單向關聯——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;
       
       
    //構造方法及set方法get方法
       
    }
    在以上代碼中customer屬性要使用<many-to-one>來映射:
    多對一單向關聯(many方)
    <many-to-one>
        name 
    = "customer"   --待映射的持久化類屬性名
        column 
    = "customer_Id"  --數據庫外鍵字段
        
    class = "mypack.Customer"  --持久化類
        not
    -null = "true"/>
    a.  <many-to-one>的not-null屬性 
    not-null屬性會影響Hiberntae的運行時行為,Hibernate在保存Order對象時,會先檢查它的customer屬性是否為null:
    若為null:在執行session.save(Order)時會拋出PropertyValueException異常;
    原因很簡單:既然Customer為null,那么對應的外鍵Customer_Id也為null,試問外鍵都沒有,Order表的數據能插得進去嗎
    若將not-null 屬性設為false:表示外鍵引用可以為null,試想一下,數據庫數據可以插進去嗎?
    我們來看:在執行session.save(Order)時,發出了sql語句:insert into......
    但是當Hibernate自動清理(flush)緩存時,拋出新的異常:TransientObjectException
    所謂清理是提交事務或手動Flush,將session與數據庫保持同步,很顯然不可能同步嘛,Order對象雖然持久化,但Customer沒有.
        注:是否應該把<many-to-one>的not-null屬性設為true,這根據實際業務而定。通常,訂單總是由客戶自己發出,因此建議設為true.
    b.  級聯保存與更新
    默認情況下,Hibernate持久化一個對象,不會自動持久化所關聯的其它臨時對象,因此會有TransientObjectException,
    想它關聯也可以,<many-to-one>中加個屬性cascade="save-update"即可.

    2.建立一對多關聯——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();

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

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


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

    評論:
    # re: 精通Hibernate——映射一對多關聯關系 2009-10-18 20:26 | 夢芭莎女性內衣
    應該同時修改關聯兩端的對象屬性  回復  更多評論
      
    # re: 精通Hibernate——映射一對多關聯關系 2009-10-20 03:31 | 美容
    精通Hibernate——映射一對多關聯關系 good  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 国产精品亚洲一区二区三区在线观看 | 午夜在线免费视频| 免费网站看v片在线香蕉| 国产成人精品曰本亚洲79ren| 亚洲av最新在线网址| 亚洲一区二区三区国产精华液| 人成免费在线视频| 亚洲中文字幕无码永久在线| 一级全免费视频播放| 久久久亚洲精品蜜桃臀| 久久久久se色偷偷亚洲精品av| sss日本免费完整版在线观看| 在线观看AV片永久免费| 久久精品国产99国产精品亚洲| 亚欧洲精品在线视频免费观看| 免费99精品国产自在现线| 亚洲av片不卡无码久久| 香蕉免费一区二区三区| 亚洲国产成人精品无码区在线网站| www成人免费观看网站| 免费无码又黄又爽又刺激| 亚洲av网址在线观看| 国产亚洲综合视频| 区三区激情福利综合中文字幕在线一区亚洲视频1 | a毛片在线还看免费网站| 亚洲天天做日日做天天欢毛片| 未满十八私人高清免费影院| 亚洲成AV人片在线观看无码 | 伊伊人成亚洲综合人网7777| 免费视频精品一区二区三区 | 亚洲另类春色校园小说| 国产精品无码一二区免费| 中文在线观看国语高清免费| 久久久亚洲欧洲日产国码二区| 免费国产污网站在线观看| 亚洲午夜国产精品无卡| 亚洲精品成人片在线观看| h视频在线观看免费完整版| 国产亚洲人成在线播放| 午夜精品在线免费观看| 三年片在线观看免费西瓜视频|