3

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

但是使用这样的代码:

Organization updated = mergeToOrganization(jaxbOrganizationPojo, originalOrganization);

我真的觉得我应该mergeToOrganization通过制作保护性副本originalOrganization而不是直接对其进行变异来开始该方法。直接突变让我感觉很脏。但替代方案似乎是粗略的反射或 loooong get/set 样板代码。

想法?意见?

4

2 回答 2

9

只要您正确处理事务,我看不出直接突变有什么问题。但是,如果您想从持久上下文中删除实体,假设您使用的是 JPA 2.0,则可以使用EntityManager.detach()。这样,从技术上讲,实体永远不会被标记为“脏”,您也不必为此感到难过。另外,请确保使用merge()将其保存回来而不是persist(),否则您会遇到许多令人讨厌的异常。

编辑如果您想返回实体的新副本,到目前为止我见过的最防弹的克隆方法是使用 ObjectOutputStream:http: //javatechniques.com/blog/faster-deep-copies-of-java -对象/

于 2013-01-22T06:51:43.693 回答
1

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

见, http://wiki.eclipse.org/EclipseLink/Examples/JPA/AttributeGroup#Copy_Examples

于 2013-01-22T14:04:21.057 回答