2013-01-22 75 views
3

在我的Spring應用程序中,我有以XML讀取的代碼,然後通過JPA提取例如組織實體,然後將XML中找到的字段更新爲組織並返回組織。製作JPA實體的保護副本

但隨着這樣的代碼:

Organization updated = mergeToOrganization(jaxbOrganizationPojo, originalOrganization); 

我真的覺得我應該通過製作originalOrganization保護副本,而不是直接突變它啓動mergeToOrganization方法。直接突變讓我感覺很髒。但是替代方案似乎是粗略的反思或懶惰的獲取/設置鍋爐板代碼。

想法?意見?

回答

9

只要您正確處理交易,我不會看到直接突變有什麼問題。但是,如果您想從持久性上下文中刪除該實體,則假定您使用的是JPA 2.0,則可以使用EntityManager.detach()。這樣,從技術上講,實體將永遠不會被標記爲「髒」,您不必爲此感到不快。此外,請確保使用merge()將其保存回來,而不是persist(),否則您會收到許多令人討厭的例外情況。

編輯如果你想回到你的實體的一個新副本,所以到目前爲止,我見過的最防彈克隆方法是,使用ObjectOutputStream:http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

+0

這不是太大的問題我有JPA,而一般的感覺,我不應該直接突變方法的參數。但是我的參數是JPA實體,爲克隆它們帶來了一系列新問題。 – vertti

+0

@vertti:查看我關於克隆JPA實體的編輯。 –

+0

很多thx爲深拷貝java的例子我用來複制實體對象並創建新的(當然還有一些需要的工作),但基本的東西依賴於建議和示例 –