制作JPA实体的保护副本

时间:2013-01-22 06:34:50

标签: java spring jpa clone

在我的Spring应用程序中,我有以XML格式读取的代码,然后通过JPA获取组织实体,然后将XML中的字段更新到组织并返回组织。

但是使用这样的代码:

Organization updated = mergeToOrganization(jaxbOrganizationPojo, originalOrganization);

我真的觉得我应该通过制作mergeToOrganization的保护副本而不是直接改变它来启动originalOrganization方法。直接突变让我觉得很脏。但是,替代方案似乎是粗略的反映或loooong获取/设置锅炉板代码。

想法?意见?

2 个答案:

答案 0 :(得分:9)

只要您正确处理交易,我看不出直接变异的问题。但是,如果要从持久化上下文中删除实体,假设您使用的是JPA 2.0,则可以使用EntityManager.detach()。这样,从技术上讲,实体永远不会被标记为“脏”,您不必为此感到沮丧。此外,请务必使用merge()将其保存回来而不是persist(),否则您将获得许多令人讨厌的例外情况。

编辑如果您想要返回实体的新副本,我目前看到的防弹克隆方法最多就是使用ObjectOutputStream:http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

答案 1 :(得分:1)

另一种选择是使用您自己的clone()方法,或者如果使用EclipseLink,则可以使用copy()API。

请参阅, http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#Copy_Examples