EJB學習日記 16

2021-04-13 14:19:25 字數 2742 閱讀 3875

2023年10月10日 06:57:00

實體之間的級聯關係

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

public

enum

cascadetype

屬性中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.

class, 1

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

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

來自: 千里冰封

EJB學習日記 7

七種對映關係 在實體bean中,互相之間的關係有七種,分別是如下七種 1,一對一單向 2,一對一雙向 3,一對多單向 4,一對多雙向 5,多對一單向 6,多對多單向 7,多對多雙向 大家可能發現,為什麼沒有多對一雙向呢?其實多對一的雙向,就是一對多的雙向,道理是一樣的.今天把典型的應用場哈舉個例子,...

Java菜鳥學習日記16

直接使用jsbc開發的問題 當表中的列很多時,需要寫很長的sql語句,還需要寫大量的引數設定語句 set 讀取資料時,還需寫大量的設定屬性語句 set 易錯且不易修改,如某個字段需要去掉,就需要調整後續的很多序號 大量的時間都花在了 搬磚 上 而且很容易埋下bug,後期測試和修復時間大大增加 結論 ...

訓練日記 16

今天首先把樹狀陣列中求逆序數的演算法看了一下,然後看了一下線段樹的課件。逆序數的基本框架如下 include include include include include using namespace std int b 500005 c 500005 int n struct node int...