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就是全部的意思,它表示以上四種關聯它都擁有。

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

          主站蜘蛛池模板: 南漳县| 河东区| 竹溪县| 黔江区| 仙居县| 新和县| 连江县| 垦利县| 余江县| 夹江县| 民丰县| 子长县| 陆丰市| 淳安县| 杭锦旗| 三河市| 牟定县| 双鸭山市| 陆川县| 正镶白旗| 吴忠市| 江山市| 巧家县| 南平市| 军事| 穆棱市| 错那县| 故城县| 山东省| 叙永县| 大理市| 靖州| 固安县| 江山市| 马鞍山市| 象州县| 永修县| 溧水县| 关岭| 巴楚县| 双流县|