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

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

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

    posts - 0, comments - 77, trackbacks - 0, articles - 356
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    EJB學習日記(16)

    Posted on 2007-10-12 10:46 semovy 閱讀(303) 評論(0)  編輯  收藏 所屬分類: EJB

    實體之間的級聯關系

    我們在以前的七種關系映射中經常會在注釋中看到如下方法: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就是全部的意思,它表示以上四種關聯它都擁有。

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

    主站蜘蛛池模板: 亚洲av色香蕉一区二区三区| 一级大黄美女免费播放| 日韩精品无码免费视频| 久草福利资源网站免费| 女人18毛片免费观看| 亚洲精品无码精品mV在线观看| 亚洲精品视频观看| 特a级免费高清黄色片| 国产高清不卡免费在线| 免费人成视频在线观看不卡| 亚洲国产日产无码精品| www免费黄色网| 在线免费观看色片| 亚洲av无码成人影院一区| 日本高清免费aaaaa大片视频| 亚洲国产高清人在线| 免费国产污网站在线观看不要卡| 免费国产成人午夜私人影视| 黄色一级毛片免费看| 免费电视剧在线观看| 亚洲av永久无码精品网站 | 人成电影网在线观看免费| 亚洲伊人成无码综合网 | 猫咪免费人成网站在线观看| 亚洲天堂中文字幕在线| 两个人www免费高清视频| 国产免费观看视频| 99热亚洲色精品国产88| 久久久久久久久久久免费精品| 又黄又爽无遮挡免费视频| 日韩在线观看免费完整版视频| 亚洲中文字幕无码一久久区| 看免费毛片天天看| 成年女人18级毛片毛片免费观看| 亚洲国产美女精品久久久久| 日日麻批免费40分钟无码| 亚洲精品无码久久久久去q| 中文字幕免费视频| 久久久久亚洲av无码专区| 免费黄色电影在线观看| 国产亚洲精品激情都市|