2015-04-19 14 views
0

我真的很難找到一個現實世界用於CascadeType.DETACH,CascadeType.MERGE,CascadeType.REFRESH OneToMany關係。OneToMany上CascadeTypes(DEATCH/REMOVE/REFRESH)的真實世界用法?

讓我們把它放在一個例子:

User hasMany UserAccess 

每次在網站上的用戶登錄,則創建包含他的IP地址和DateTime一個UserAccess對象。

  1. 這些03 CascadeTypes如何影響現實世界過程中的這種關聯?我幾乎可以看到CascadeType.PERSIST(用於級聯持久性)和CascadeType.REMOVE(如果用戶被刪除時刪除子級)的用法。 OrphanRemoval在這種情況下也是可恥的,毫無疑問。

  2. 如果我的例子不夠完整,有沒有人能夠就這個問題制定一個真實世界的例子?

謝謝!

回答

2

我很難與你的例子思考,因爲分離和合並往往是在你的影響範圍之外訪問的實體。出於這個原因,我會堅持一些無聊的例子,如文件收集。

兩點之前,我到示例:

首先,根據經驗,瞭解Hibernate的級聯一個有用的規則是這樣認爲他們:「如果我級聯操作X從A到B,然後當我在休眠狀態下,呼叫操作X將自動調用所有關聯B上的操作X.(孤兒刪除是例外)「

其次,考慮到這一點,除孤兒刪除以外的所有級聯的優點僅僅是爲了節省你迭代子對象並調用子對象的操作的麻煩。你自己做這件事和讓Hibernate做這件事之間沒有功能上的區別。現在

,對於例如:

假設你的應用程序將跟蹤其具有有許多段落的對象很多文檔對象DocumentCollection對象。您希望此應用程序由其他團隊構建的桌面界面使用。你的團隊擁有後端,另一個團隊擁有前端,但不是一個Web應用程序,所有這些都發生在同一個過程中。

爲簡單起見,該接口將搶DocumentCollection批發讓你的公共API將只是:

public DocumentCollection fetchCollection(String collectionName); 
public void updateCollection(DocumentCollection collection); 

現在,因爲你不知道什麼界面團隊會後,與你DocumentCollection他們獲取它,然後你想要做的最後一件事是將一個活的持久實體傳遞給它們,單獨的事務管理將是可怕的。要解決此問題,您需要在發送任何內容之前先將其分離。

現在通常情況下你並不需要分離任何東西,因爲在你返回對象之前你會關閉你的會話,所以讓事情變得更加複雜。讓我們假裝你的用戶正在和一些多頁面的窗體部件進行交互,並且你希望在部件的持續時間內保持會話打開(這是會話每會話,但如果你認爲這個例子時間太長,這是我能做的最好的事情)。

所有這一切都真的證明了你爲什麼想首先分離某些東西,我懷疑你的問題的核心問題比你想象的更重要。因此,鑑於這種情況做作您的選擇是:

  1. 呼叫分離的DocumentCollection,通過每個文件進行迭代,並調用分離上,然後通過每個段落重複,並呼籲拆除這些。
  2. Cascade分離DocumentCollection-> Document和Document-> Paragraph關係,只是在DocumentCollection上調用detach,讓Hibernate爲你做迭代。

當然,一旦用戶完成修改文檔並將其傳回來保存它,那麼您將不得不在一切中調用合併,因此級聯合並將非常有用。

對於刷新,讓我們來看一個不同的例子(這可能更人造,因爲我自己沒有這樣做)。假設您決定相信您的界面團隊,並且您不想分離這些對象。這允許您跳過呼叫分離和合並。現在,讓我們假設用戶點擊某種「恢復上次保存」按鈕。您決定通過「刷新」DocumentCollection和下面的所有內容來實現此目的。在這裏,級聯會非常有幫助,因爲它會爲您節省大量迭代。

+0

我非常仔細地閱讀你的解釋兩次。我現在明白了。我很感謝你回答這個問題。謝謝! – Renatinn