2012-11-14 54 views
0

我正在使用EclipseLink 2.3.3。與約100個實體的數據模型。我有一個Java類映射到每個數據庫表使用註釋。JPA/EclipseLink:爲某些合併操作禁用級聯?

我有兩個用例來實現。其中之一是一個新的記錄進入了大約60-75張桌子的系統。對於這種情況,我想合併並持續級聯,以便我可以合併頂級對象並將其級聯到所有相關實體。

另一個用例是我需要插入一個單獨的對象集合,通常來自一堆不同的表中的每一個。在這種情況下,我不希望級聯合並,因爲我需要控制插入。如果啓用了級聯,則合併第一個對象可能會或可能不會合並其他對象,具體取決於它們是否相關,因此我寧願明確地合併它們中的每一個。

所以基本上,我想級聯合並並堅持在一種情況下,而不是另一種情況。因此,如果我在映射類中包含級聯註釋,則需要選擇性地禁用某些操作的級聯;或者,如果關閉映射類中的級聯,我想爲某些操作啓用級聯。

到目前爲止,我沒有找到任何方法來選擇性地打開或關閉特定操作的級聯。有一個CascadePolicy類,但似乎只能用於查詢。有動態實體,我想也許我可以用它來做一些事情,比如從現有實體創建一個動態實體,並關閉該實體關係的級聯行爲,並以某種方式將它用於合併,但我一直未能爲此找到合適的API。

所以我想知道是否有更好的答案,我可以忽略的地方?感謝您的任何信息。

回答

1

我不確定您的控制級別,特別是在您提到要插入單個對象的情況下。從它的聲音來看,在第一種情況下級聯合並正是你想要的EntityManager.merge實體對象樹。調用實體的合併將檢查它是否是新的,並根據需要進行更新或插入。將關係標記爲級聯合並將允許查找新對象並將其插入。

第二種情況,雖然你想要處理單獨的插入,爲什麼不排除在映射上的級聯持久選項,並只需要調用EntityManager.persist你想插入的對象?堅持然後不會級聯,所以只有你調用em.persist的實體纔會被插入。關係將僅用於設置外鍵值 - 儘管您可能希望將它們留空並稍後將它們設置爲較大的合併調用的一部分。需要維護雙向關係的雙方,如果對方存在並且不合並,則不存儲關係更改。

如果這不是您想要的,EclipseLink在UnitOfWork上具有本地API(EntityManager實質上包裝了一個用於事務性工作的UnitOfWork),允許您指定合併策略。請參閱UnitOfWork上的mergeClone,deepMergeClone和shallowMergeClone,它們本質上分別使用CASCADE_ALL_PARTS,CASCADE_PRIVATE_PARTS和NO_CASCADE作爲合併策略,而JPA合併使用CASCADE_BY_MAPPING。

+0

任何想法如何使用NO_CASCADE? – Aguid