JPA中的深层复制

Use*_*er1 14 java jpa

我想在JPA中制作一个实体的深层副本.我在这里找到了一个有趣的讨论:http: //forums.java.net/jive/thread.jspa?messageID = 253092&tstart = 0

听起来像提议的解决方案是将所有@ Id设置为零.这是我的基本代码:


//Start a JPA session.
EntityManager em= emf.createEntityManager();
em.getTransaction().begin();

//Get the object I want to copy.
MyClass myObject=em.find(MyClass.class,id);

//Use reflection to find @Id's and set them to zero for all @OneToMany and @OneToOne relations.
//TODO:  write the ugly recursive code to do this.

//Hoping this will create a deep copy.
em.merge(myObject);

//Close the session.
em.getTransaction().commit();
em.close();
Run Code Online (Sandbox Code Playgroud)

这是一个好策略吗?任何人都可以写这个TODO代码,他们可以共享???

谢谢!

Vic*_*erg 5

我解决了这个问题。

我创建了一个组件,它根据包 ( javax.persistence)的注释为您完成整个过程。

组件已将实体的 id 设置为 null。他做算法的所有分析,根据每个属性关系的类型可以应用@OneToMany@OneToOne@ManyToMany

例子

Person person = personDAO.find(1);
PersistenceCloner cloner = new PersistenceCloner(person); 
Person personCopy = cloner.generateCopyToPersist();
Run Code Online (Sandbox Code Playgroud)

下载JAR 和来源:jpa-entitycloner


Use*_*er1 2

我能够按照问题中的描述获得一份深层副本来工作。有必要立即加载整个图并将 @Id 重置为 null 或零。我发现 Hibernate SessionFactory 实际上有方法可以帮助完成这个过程。

上面关于深拷贝的其他建议似乎不起作用。诚然,问题可能出在键盘和椅子之间。但它现在正在发挥作用。

感谢大家!

  • 基本上你说我们需要急切地加载整个图表,但我们的图表并不经常有延迟初始化的集合。您还评论说 SessionFactory 有方法可以帮助重置 @id 的过程。你能提供一些代码示例吗,因为我面临着同样的问题,这让我发疯:) (5认同)