2017-07-29 16 views
1

對於JPA,我在實體類中定義諸如級聯類型和orphanRemoval設置之類的問題時遇到問題。對我而言,在實體上定義Cascade Type和orphanRemoval是有限制的,因爲它假設您始終希望這些設置在所有場景中都相同。針對不同用例的不同CascadeType值

但是,我可以想到很多情況下,應用程序有時可能需要orphanRemoval,而其他時間不需要給定實體的orphanRemoval。同樣,應用程序有時可能需要一個級聯類型,並且在其他時間需要不同的級聯類型用於同一個實體。

我希望實體管理器可以讓你在做合併,堅持等等時指出級聯類型(orphanRemoval)應該是什麼,但我不認爲api支持這一點。

是否可以針對不同場景使用不同級聯類型或orphanRemoval值?

我發現這個問題JPA programmaticaly define cascading options它提出了一個類似的問題,答案似乎是,它是不可能的,至少與級聯類型。我開始認爲我不應該爲我的任何關係使用級聯類型/ orphanRemoval,這意味着在我確實希望孩子被保存/更新的情況下,我將不得不手動執行此操作。

+0

我已經刪除了你的第二個問題,因爲你應該堅持每個問題一個問題,它使你的問題主要是基於觀點的,這將使它脫離主題。 –

回答

0

對我來說,在實體上定義Cascade Type和orphanRemoval是有限制的,因爲它假定您始終希望這些設置在所有場景中都是相同的。

我發現該假設是合理的,因爲實體中的級聯設置直接與底層數據庫中相應外鍵(FK)約束的引用完整性(RI)操作相關。如果我們希望這些規則在「數據庫」級別(這相當於在Hibernate中的「實體」級)被自動執行,則數據庫通常希望那裏是一個規律可循,例如,

ALTER TABLE Sales.TempSalesReason  
ADD CONSTRAINT FK_TempSales_SalesReason FOREIGN KEY (TempID)  
    REFERENCES Sales.SalesReason (SalesReasonID)  
    ON DELETE CASCADE  
    ON UPDATE CASCADE  
; 

如果我們希望在不同的情況下應用不同的RI規則,那麼取決於我們的應用程序代碼,通過在子表上執行自己的UPDATE或DELETE操作來執行這些規則,或者通過阻止初始數據庫操作在FK約束中觸發RI規則(如果有的話)。