在我的Spring应用程序中,我有以XML格式读取的代码,然后通过JPA获取组织实体,然后将XML中的字段更新到组织并返回组织。
但是使用这样的代码:
Organization updated = mergeToOrganization(jaxbOrganizationPojo, originalOrganization);
我真的觉得我应该通过制作mergeToOrganization
的保护副本而不是直接改变它来启动originalOrganization
方法。直接突变让我觉得很脏。但是,替代方案似乎是粗略的反映或loooong获取/设置锅炉板代码。
想法?意见?
答案 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