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

时间:2010-09-29 13:59:00

标签: java orm jpa

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

我想要做的是覆盖Entity.clone()(或者有一个新方法)来深度复制Entity以及children的克隆,这些克隆属于同一个父级并被分配已经存在的用户。

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

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

我的问题是:

我想要做什么是可行的,还是应该管理从例如门面? 如果它是可行的,你可以指导我阅读或给我一些提示,因为到目前为止我通过外观进行克隆,这已经成为我申请中的主要负担。

先谢谢!!

pataroulis

3 个答案:

答案 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更详细的答案:。