制作 JPA 实体的保护副本

3

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

但是使用这样的代码:

Organization updated = mergeToOrganization(jaxbOrganizationPojo, originalOrganization);

我觉得在开始mergeToOrganization方法时,应该先对originalOrganization进行保护性拷贝,而不是直接对其进行修改。 直接修改会让我感到不舒服。但是其他替代方案似乎都涉及反射或冗长的get/set代码。

有什么想法或意见吗?

2个回答

9
只要您正确处理事务,我认为直接修改没有问题。但是如果您想从持久化上下文中删除实体(假设您使用的是JPA 2.0),您可以使用EntityManager.detach()。这样,从技术上讲,该实体将永远不会被标记为“脏”,您也不必感到难过。另外,请确保使用merge()保存它而不是persist(),否则会出现许多nasty exceptions。 编辑 如果您想返回实体的新副本,则目前最可靠的克隆方法是使用ObjectOutputStream:http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

我对JPA并没有太大的问题,而是普遍感觉不应该直接改变方法参数。但我的参数是JPA实体,这给克隆它们带来了一整套新问题。 - vertti
非常感谢您提供的Java深拷贝示例,我已经使用它来复制实体对象并创建新的对象(当然还需要一些工作),但基本的东西都依赖于您的建议和示例。 - Miklos Krivan

1

我本来希望避免编写自己的clone(),因为我认为这样会增加错误率并带来额外的维护麻烦。不幸的是,我正在使用Hibernate而不是EclipseLink。 - vertti

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接