gpt4 book ai didi

java - jpa 中的 org.apache.openjpa.persistence.EntityExistsException

转载 作者:行者123 更新时间:2023-12-01 15:58:11 25 4
gpt4 key购买 nike

我有一个 JTA 事务,它管理 2 个数据库 A 和 B 的事务。现在在 jta 事务中,我有一个从数据库 A 返回实体的方法。我想如何为某个主键设置一些不同的值(主键是复合主键),然后将实体保留为新记录。但是我收到以下异常:

                                 <openjpa-1.2.2-SNAPSHOT-r422266:778978M-OPENJPA-975 nonfatal store error> org.apache.openjpa.persistence.EntityExistsException: Attempt to persist detached object "xyz.abc@616f991c".  If this is a new instance, make sure any version and/or auto-generated primary key fields are null/default when persisting.
FailedObject: xyz.abc-
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2421)
at org.apache.openjpa.kernel.BrokerImpl.persist(BrokerImpl.java:2280)
at org.apache.openjpa.kernel.DelegatingBroker.persist(DelegatingBroker.java:1021)
at org.apache.openjpa.persistence.EntityManagerImpl.persist(EntityManagerImpl.java:645)
at com.ibm.ws.jpa.management.JPAExEmInvocation.persist(JPAExEmInvocation.java:339)
at com.ibm.ws.jpa.management.JPAEntityManager.persist(JPAEntityManager.java:133)
at com.ibm.cloud.bss.db.data.controller.CostrateManager.createCostrate(CostrateManager.java:94)
at com.ibm.cloud.bss.omt.catalog.impl.BundleManager.saveSubcomponentInECW(BundleManager.java:409)
at com.ibm.cloud.bss.omt.catalog.impl.BundleManager.createBundle(BundleManager.java:274)
at com.ibm.cloud.omt.OfferingManagementSOAPBindingImpl.createBundle(OfferingManagementSOAPBindingImpl.java:222)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:599)
at org.apache.axis2.jaxws.server.dispatcher.JavaDispatcher.invokeTargetOperation(JavaDispatcher.java:81)
at org.apache.axis2.jaxws.server.dispatcher.JavaBeanDispatcher.invoke(JavaBeanDispatcher.java:98)
at org.apache.axis2.jaxws.server.EndpointController.invoke(EndpointController.java:109)
at org.apache.axis2.jaxws.server.JAXWSMessageReceiver.receive(JAXWSMessageReceiver.java:159)
at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:188)
at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:275)
at com.ibm.ws.websvcs.transport.http.WASAxis2Servlet.doPost(WASAxis2Servlet.java:1389)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:738)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:831)

我在网上搜索并折叠了这篇文章,类似于我的: http://openjpa.208410.n2.nabble.com/persisting-an-entity-and-JPA-behaviour-with-referenced-entities-td210469.html

最佳答案

来自 JPA 1.0 规范:

A new entity instance becomes both managed and persistent by invoking the persist method on it or by cascading the persist operation. The semantics of the persist operation, applied to an entity X are as follows:

If X is a detached object, the EntityExistsException may be thrown when the persist operation is invoked, or the EntityExistsException or another PersistenceException may be thrown at flush or commit time.

如果您想要的只是更改主键并且该实体是托管实体,那么只需更改其值,一旦事务结束,这些值将自动保留。另一种方法是更改​​值并显式调用 merge 方法。

但是,如果您想要创建一个与检索到的对象具有相同属性的新对象并保持检索到的对象完整,则必须首先检索该对象,然后创建一个新对象并将属性从检索到的对象复制到新对象,然后在新对象上调用 persist 方法。您可以使用BeanUtils.copyProperties方法将属性从源对象复制到目标对象,也可以自己完成。

关于java - jpa 中的 org.apache.openjpa.persistence.EntityExistsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4614812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com