Java 具有关系的EJB实体bean的深度复制
我拥有的是一个实体bean,例如,Java 具有关系的EJB实体bean的深度复制,java,orm,jpa,Java,Orm,Jpa,我拥有的是一个实体bean,例如,entity(ejb3),它在ArrayList中保留相同类型的子对象、其父对象以及与另一个实体的关系。用户可以拥有多个实体,反之亦然(多对多) 我想做的是重写Entity.clone()(或使用新方法)以深度复制Entity,以及子项的克隆,这些子项属于同一父项,并被分配给现有用户 我已经设置了克隆方法来创建实体(即新实体)的克隆,然后在foreach循环中用子实体的克隆填充它 但这给了我一个并发修改异常,我最终只得到了初始实体bean的一个克隆,没有它的子项
entity
(ejb3),它在ArrayList
中保留相同类型的子对象、其父对象
以及与另一个实体的关系
。用户可以拥有多个实体,反之亦然(多对多)
我想做的是重写Entity.clone()
(或使用新方法)以深度复制Entity
,以及子项的克隆,这些子项属于同一父项,并被分配给现有用户
我已经设置了克隆方法来创建实体
(即新实体)的克隆,然后在foreach循环中用子实体
的克隆填充它
但这给了我一个并发修改异常,我最终只得到了初始实体
bean的一个克隆,没有它的子项
我的问题是:
我想做的事情是否可行,或者我是否应该管理从正面进行的深度复制?
如果可行的话,你能告诉我一些可以阅读的东西或者给我一些提示吗?因为到目前为止,我是通过一个门面进行克隆的,这已经成为我应用程序中的一个主要负担
提前谢谢
pataroulis尝试使用(从)
您必须使您的实体可序列化
(但您可能并不一定需要)。另外,这应该在EntityManager
仍处于打开状态时进行,否则会出现延迟初始化异常。您必须创建一个新列表,否则将添加到正在迭代的同一列表中,因此会出现并发修改异常
i、 e
如果您使用的是EclipseLink,还可以使用EclipseLink JPAEEntityManager上的copy()API。您可以传递一个复制组,该复制组指定制作副本的深度,以及是否应重置Id。如果未分离您的实体,您必须处理几个问题。此外,您还必须克隆或序列化事务作用域之外的实体,否则您将获得detachedEntityPassedOpersistException()。
更详细的回答:
YourEntity clone = SerializationUtils.clone(entity);
Entity clone = super.clone();
clone.setChildren(new ArrayList());
for (Child child : this.getChildren()) {
clone.addChild(child.clone());
}
return clone;