使用关系深度复制EJB实体bean

我所拥有的是一个实体bean,例如Entity (EJB 3),它在ArrayList中保存相同类型的子节点,他的父节点以及与另一个实体的关系。 用户可以拥有许多实体,反之亦然(多对多)。

我想要做的是覆盖Entity.clone() (或者有一个新方法)来深度复制Entity以及属于同一父节点并分配给现有用户的子节点克隆。

我已经设置了克隆方法来创建Entity的克隆(一个新的实体),然后在foreach循环中用子实体的克隆填充它。

但是这给了我一个并发修改exception,我最终得到的是没有children的初始Entity bean的克隆。

我的问题是:

我想要做什么是可行的,还是应该从例如Facade管理深度复制? 如果它是可行的,你能指导我阅读或给我一些提示,因为到目前为止我通过外观进行克隆,它已成为我的应用程序的主要负担。

提前致谢!!

pataroulis

尝试使用(来自commons-lang )

 YourEntity clone = SerializationUtils.clone(entity); 

你必须使你的实体Serializable (你可能不一定想要)。 此外,这应该在EntityManager仍处于打开状态时完成,否则您将获得延迟初始化exception。

您必须创建一个新的List,否则您将添加到正在迭代的同一个List,因此会出现并发修改exception。

 Entity clone = super.clone(); clone.setChildren(new ArrayList()); for (Child child : this.getChildren()) { clone.addChild(child.clone()); } return clone; 

如果您正在使用EclipseLink,您还可以使用EclipseLink JpaEntityManager上的copy()API。 您可以传递一个CopyGroup,指定复制的深度,以及是否应重置Id。

如果未分离oyur实体,则必须处理几个问题。 此外,您必须在事务scoper之外克隆或serilize您的实体,否则您将获得DetachedEntityPassedToPersistException()。 这里有更详细的答案:。