2010-09-29 41 views
1

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

我想要做的是覆盖Entity.clone()(或者有一个新的方法),以深拷贝Entitychildren克隆一起,属于同一母公司和被分配到已经存在的用户。

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

但是,这给了我一个并发修改异常,我最终只有最初的Entity豆克隆没有它的children

我的问题是:

是我想都做可行的,或者我应该从管理的例如深复制一个门面? 如果可行的话,你能指示我请读一些东西或给我几点提示,因为直到现在我通过一个门面进行克隆,它已经成为我应用程序中的一个主要负担。

在此先感谢!

pataroulis

回答

2

尝试使用(从commons-lang

YourEntity clone = SerializationUtils.clone(entity); 

你必须让你的实体Serializable(你不一定想要的,虽然)。此外,这应该在EntityManager仍然打开的情况下完成,否则你会得到懒惰的初始化异常。

1

您必须创建一个新的列表,否则您将添加到您正在迭代的同一列表中,因此会发生并发修改异常。

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

如果您使用的EclipseLink您也可以使用上的EclipseLink JpaEntityManager副本()API。您可以传递指定复制程度有多深的CopyGroup,以及是否应重置Id。

0

如果oyur实体没有分离,你必须处理几个问题。此外,你必须克隆或serilize您的实体以外的事务scoper otherwithe你会得到DetachedEntityPassedToPersistException()。 Here is更详细的解答:。