我想在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代码,他们可以共享???
谢谢!
我解决了这个问题。
我创建了一个组件,它根据包 ( 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
我能够按照问题中的描述获得一份深层副本来工作。有必要立即加载整个图并将 @Id 重置为 null 或零。我发现 Hibernate SessionFactory 实际上有方法可以帮助完成这个过程。
上面关于深拷贝的其他建议似乎不起作用。诚然,问题可能出在键盘和椅子之间。但它现在正在发挥作用。
感谢大家!
| 归档时间: |
|
| 查看次数: |
20319 次 |
| 最近记录: |