0

2 つのデータベース A と B のトランザクションを管理する JTA トランザクションがあります。現在、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

4

1 に答える 1

1

JPA 1.0 仕様から:

新しいエンティティ インスタンスは、persist メソッドを呼び出すか、persist 操作をカスケードすることによって、管理され、永続化されます。エンティティ X に適用される持続操作のセマンティクスは次のとおりです。

X が切り離されたオブジェクトの場合、永続化操作が呼び出されたときにEntityExistsExceptionがスローされるか、フラッシュまたはコミット時に EntityExistsException または別の PersistenceException がスローされる可能性があります。

主キーを変更するだけで、エンティティが管理対象エンティティである場合は、その値を変更するだけで、トランザクションが終了すると、それらの値は自動的に永続化されます。もう 1 つの方法は、値を変更して明示的にマージメソッドを呼び出すことです。

ただし、取得したオブジェクトと同じプロパティを使用して新しいオブジェクトを作成し、取得したオブジェクトをそのまま維持したい場合は、最初にオブジェクトを取得してから新しいオブジェクトを作成し、取得したオブジェクトから新しいオブジェクトにプロパティをコピーして、その後、新しいオブジェクトでpersistメソッドを呼び出します。BeanUtils.copyPropertiesメソッドを使用してソース オブジェクトから宛先オブジェクトにプロパティをコピーするか、自分で行うことができます。

于 2011-01-06T15:18:50.260 に答える