org.apache.openjpa.persistence.EntityExistsException в jpa - PullRequest
0 голосов
/ 06 января 2011

У меня есть JTA transcation, который управляет транзакцией 2 баз данных A и B. Теперь внутри jta transcation у меня есть метод, который возвращает сущность из базы данных 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) 

Я искал в сети и складываю этот пост, похожий на myne: http://openjpa.208410.n2.nabble.com/persisting-an-entity-and-JPA-behaviour-with-referenced-entities-td210469.html

1 Ответ

1 голос
/ 06 января 2011

Из JPA 1.0 Спецификация:

Новый экземпляр объекта становится одновременно управляемым и постоянным, вызывая для него метод persist или каскадную операцию persist.Семантика операции persist, применяемой к объекту X, выглядит следующим образом:

Если X является отсоединенным объектом, EntityExistsException может быть выброшено при вызове операции persist или EntityExistsExceptionили другое исключение PersistenceException может быть выдано во время сброса или фиксации.

Если вы хотите просто изменить первичный ключ, а объект является управляемым объектом, то просто измените его значения, и как только транзакция закончится,значения будут сохранены автоматически.Другим способом является изменение значений и явный вызов метода merge .

Но если вам нужно создать новый объект с такими же свойствами извлеченного объекта и сохранить извлеченный объект без измененийсначала вам нужно получить объект, затем создать новый объект и скопировать свойства из полученного объекта в новый объект, а после этого вызвать метод persist для нового объекта.Вы можете использовать метод BeanUtils.copyProperties , чтобы скопировать свойства из исходного объекта в целевой объект, или вы можете сделать это самостоятельно.

...