2017-04-18 138 views
1

我已經多次讀取級聯類型定義,但我無法得到我的頭圍繞哪個用於我試圖實現的特定情況。休眠JPA級聯類型

我有workerWorker類和Task類之間@OneToMany關係,因此可以具有多個任務,但每一Task是僅對於一個Worker

private List <Task> tasks保持任務在Worker類和 private Worker worker;Worker對象在Task

我被困在下面的?,不知道我應該使用哪個級聯類型。

@OneToMany(targetEntity=Task.class, mappedBy="worker", cascade=CascadeType.?, fetch = FetchType.LAZY)

應該不存在彼此兩個對象,但我想改變Task對象,以反映Worker對象上,反之亦然

最終(如果我能得到這個工作:))我我想寫一個算法來匹配最好的工作人員,當一個新的任務進入系統我想知道我是否在正確的軌道上。由於

+0

「兩個對象應該彼此不存在,但我希望對Task對象的更改反映在Worker對象上,反之亦然」< - 您能指定那個意思嗎?你的意思是,如果你修改了「Task-A」,那麼Worker對象鏈接到的「Task-A」不應該鏈接到舊版本的「Task-A」?如果這就是你所關注的一切,那麼你完全不需要CascadeType(NONE)。 –

+0

我建議你'cascade = CascadeType.ALL'並添加'deleteOrphan = true'。但是如果你使用JPA 2/2.1 + Hibernate 5時要小心,級聯刪除管理不好,我建議你手動進行級聯刪除。 – Zorglube

+1

@Zorglube它是'orphanRemoval'而不是'deleteOrphan',如果他使用它,它會刪除那些與另一端沒有關係的元素,這不是他正在尋找的元素。 –

回答

1

井您的特定情況下,要恢復於一體的實體向對方改變,你不希望刪除它,如果映射實體被刪除,回答你的兩個要求:

沒有彼此

在這種情況下,應該存在

兩個對象,你不應該使用CascadeType.REMOVE類型,因爲它emoves與此設置的所有相關實體的關聯時,擁有實體刪除。

,但我想改變Task對象使用CascadeType.PERSISTCascadeType.MERGE類型將足以體現雙方之間的變化CascadeType.PERSIST涵蓋了Worker

在這種情況下,既反映save()persist()操作,而CascadeType.MERGE將處理merge()操作。

有關此主題的更多詳細信息,我建議您閱讀HowToDoInJava Hibernate JPA Cascade Types article,因爲它簡要介紹了所有這些情況。

+1

謝謝你,這對我來說很有意義。 –

+1

@UlugToprak歡迎您。 –

-1

這取決於你如何使用您的實體。

  • 如果你從不分離你的實體,那麼你不需要CascadeType.DETACH。如果你這樣做,那麼你應該包括這個CascadeTyp。
  • 當合並的分離工人回到你的持久化上下文,你還希望它的任務合併?這不是一個簡單的決定,但是從你所說的話你可能不會在同一個過程中修改一個工作者和一個任務,所以你可能不需要這個。
  • CascadeType.PERSIST通常是一個很好的選擇,因爲,你真的不能出錯,這一個。但是像上面那樣:聽起來你不是在同一個過程中創建一個工作人員和一個新任務。但如果你這樣做,然後選擇這個CascadeType。
  • 你絕對不希望CascadeType.REMOVE從我的理解。