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

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

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

    千里冰封
    JAVA 濃香四溢
    posts - 151,comments - 2801,trackbacks - 0

    實體之間的級聯關系

    我們在以前的七種關系映射中經常會在注釋中看到如下方法:cascade(),它表示級聯,也就是有關聯的一些實體,當我們對其中的一些進行操作的時候,與它相關聯的實體應該怎么辦。這樣時候,就需要我們定義cascade的屬性了,cascade一共有五種屬性,我們可以用其中的一種,也可以用其中的多種混合,其中可用的屬性如下:

    public enum CascadeType
    {
       ALL, PERSIST, 
     MERGE, REMOVE, 
     REFRESH
    }

     

    屬性中ALL表示所有的級聯,如果選了它就表示所有的級聯了,也就不必選其它的了。下面我們一個一個來講講它們的用處吧:

    1,PERSIST
    PERSIST的意思就是持久的意思,它表示當我們對其中一個實體進行持久化操作的時候,與它相關聯的也同樣持久化進數據庫,也就是執行insert動作。這樣在我們保存的時候,只需要保存一個實體就可以了,與它相關聯的實體也會被同時保存。

     

    Customer cust = new Customer( );
    Address address 
    = new Address( );
    cust.setAddress(address);

    entityManager.persist(cust);

     

    在上面的代碼中,我們只需要持久化cust就可以了,與cust相關聯的Address會自動被保存進數據庫。如果我們沒有指定PERSIST關聯,那么我們就需要再調用entityManager.persist(address)來保存Address,這樣就比較麻煩了。

    2,MERGE
    MERGE就是合并的意思,也就是把當前的實體BEAN的內容合并到數據庫里面去,如果當前實體BEAN在數據庫里面沒有相應的記錄,則它會自動插入新的記錄,在這一點上,它和PERSIST比較相似。

     

    cust.setName("William");
    cust.getAddress( ).setCity(
    "Boston");

    entityManager.merge(cust);

     

    在以上代碼中,當我們把cust的名字改了,并且把地址里面的城市名也改了以后,我們合并到數據庫的時候,Address表中的數據也一樣會跟著更新,那如果我們新加一個地址進去呢?會怎么樣呢?結果還是一樣的,如果EntityManager發現沒有這條數據時,它為了把主體合并到數據庫里面去,它就會插入一個新的實體到數據庫中。在我們在一對多的時候,可以看到這一點:

     

    Phone phone = new Phone( );
    phone.setNumber(
    "617-666-6666");

    cust.getPhoneNumbers( ).add(phone);
    Customer newCust
    =entityManager.merge(cust);

     

    在這里加了一個新的號碼,然后我們合并cust,結果新的phone也被插入數據庫了。在這里我們要注意的一點是,在這里只有返回值newCust才是在當前持久化上下文相關聯的BEAN,而做為參數傳進去的cust并不是,它可以只是一個簡單的脫離了EntityManager管理的類。

    3,DELETE
    DELETE顧名思義就是刪除的意思,當我們刪除一個實體的時候,我們標志了DELETE關聯的實體都會被相應的刪除。

     

    Customer cust = entityManager.find(Customer.class1);
    entityManager.remove(cust);

     

    當我們刪除一個cust的時候,它相關聯的phone,address也會一并被刪除。

    4,REFRESH
    REFRESH就是更新的意思,它有點類似于MERGE,但是它是和MERGE相反的,我們MERGE的時候,會把當前實體的值合并到數據庫中,而當我們REFRESH的時候,卻是把據庫的最新值更新到我們的實體BEAN中。

     

    Customer cust ;
    entityManager.refresh(cust); 
    // address would be refreshed too

     

    在上面,如果address在數據庫中被別的程序更改了,那么當這句話調用結束之后,cust里面的address也跟著更新了,在這里,cust和address的數據不會被寫入數據庫,相反的,數據庫的最新值將被寫入到它們里面。當我們不需要把數據寫入數據庫,而只需要從數據庫里面取最新的時候,這個方法是很有用的。比如數據庫某些列是數據庫觸發某個事件自動更新的,而不需要我們自己去更新,就可以用這個,這個時候,最好不是在這一列上加如下注釋以確保此列數據不會被我們人為地更改:
     @Column (insertable=false, updatable=false...

    5,ALL
    ALL就是全部的意思,它表示以上四種關聯它都擁有。

    其實并不是所有的場合都適合用關聯,因為有些時候,一些數據的更新并不影響別的數據,這個時候就不需要關聯了,比如,我們不希望多對多的時候,如果人改國籍不應該把原來的國家的實體刪掉吧。所以在我們使用關聯的時候,一定要想清楚,是不是實體之間有相輔相成的關系或者缺一不可的關系。其實使用關聯只是讓我們偷偷懶而已,因為它可以讓我們少寫一些相關的代碼,呵呵:)




    盡管千里冰封
    依然擁有晴空

    你我共同品味JAVA的濃香.
    posted on 2007-10-04 00:50 千里冰封 閱讀(1637) 評論(2)  編輯  收藏 所屬分類: JAVAEE

    FeedBack:
    # re: EJB學習日記(16)[未登錄]
    2007-10-04 17:25 | -274°C
    國慶也不歇息,該向你學習了。  回復  更多評論
      
    # re: EJB學習日記(16)
    2007-10-04 17:35 | 思寬
    en.......  回復  更多評論
      
    主站蜘蛛池模板: 亚洲精品无码久久久久AV麻豆| 亚洲精品少妇30p| 最近更新免费中文字幕大全| 亚洲理论在线观看| 蜜臀AV免费一区二区三区| 极品美女一级毛片免费| 亚洲国产精品美女久久久久| 亚洲AV乱码一区二区三区林ゆな| 国产成人免费片在线视频观看| 亚洲成年人免费网站| 91福利免费体验区观看区| 亚洲一区在线免费观看| 亚洲成a人片77777老司机| 久久夜色精品国产噜噜噜亚洲AV| 中文字幕亚洲无线码| 久久久久久AV无码免费网站下载 | 亚洲 综合 国产 欧洲 丝袜| 成人免费视频一区二区三区| 1000部拍拍拍18勿入免费视频下载| 亚洲av无码一区二区三区四区| 亚洲综合丁香婷婷六月香| 亚洲熟妇av一区| 亚洲一区AV无码少妇电影| 亚洲中文字幕一二三四区| 亚洲高清一区二区三区电影| 亚洲国产精品无码观看久久| 美女啪啪网站又黄又免费| 一级毛片免费不卡直观看| 免费A级毛片在线播放| 我们的2018在线观看免费高清| 日韩免费无码一区二区视频| 亚洲成年人啊啊aa在线观看| 亚洲韩国精品无码一区二区三区| 亚洲精品一区二区三区四区乱码| 亚洲日韩av无码中文| a级毛片高清免费视频| 成人奭片免费观看| 美女内射无套日韩免费播放| 久久久久久99av无码免费网站| 国产免费无遮挡精品视频| 亚洲精品免费观看|