我所拥有的是实体bean,例如Entity
(EJB 3)在ArrayList<Entity>
中保留相同类型的子项,其父项<Entity>
以及与另一个实体<Users>
的关系。用户可以拥有许多实体,反之亦然(多对多)。
我想要做的是覆盖Entity.clone()
(或者有一个新方法)来深度复制Entity
以及children
的克隆,这些克隆属于同一个父级并被分配已经存在的用户。
我已经设置了克隆方法来创建Entity
(一个新的实体)的克隆,然后在foreach循环中用children
个实体的克隆填充它。
但是这给了我一个并发修改异常,我最终只得到了一个没有Entity
的初始children
bean的克隆。
我的问题是:
我想要做什么是可行的,还是应该管理从例如门面? 如果它是可行的,你可以指导我阅读或给我一些提示,因为到目前为止我通过外观进行克隆,这已经成为我申请中的主要负担。
先谢谢!!
pataroulis
答案 0 :(得分:2)
尝试使用(来自commons-lang)
YourEntity clone = SerializationUtils.clone(entity);
您必须制作实体Serializable
(但您可能不一定需要)。这也应该在EntityManager
仍处于打开状态时完成,否则您将获得延迟初始化异常。
答案 1 :(得分:1)
您必须创建一个新的List,否则您将添加到正在迭代的同一个List,因此会出现并发修改异常。
即
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。
答案 2 :(得分:0)
如果未分离oyur实体,则必须处理几个问题。此外,您必须在事务scoper之外克隆或serilize您的实体,否则您将获得DetachedEntityPassedToPersistException()。 Here is更详细的答案:。