Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Camel JMS更新JPA实体_Java_Jpa_Apache Camel - Fatal编程技术网

Java Camel JMS更新JPA实体

Java Camel JMS更新JPA实体,java,jpa,apache-camel,Java,Jpa,Apache Camel,当使用类似于下面的代码时,只要我从来没有一条记录使用与前一条记录相同的主键进入,一切都正常,但如果我收到一条具有相同主键的消息,我会得到一个无法插入异常。如果我得到一个具有相同主键的记录,是否有必要设置Jpa将插入转换为更新 from("jms:queue:myqueue") .unmarshal(myGsonDataFormat) .convertBodyTo(MyDBEntity.class) .to("jpa:" + MyDBEntity.class.getName

当使用类似于下面的代码时,只要我从来没有一条记录使用与前一条记录相同的主键进入,一切都正常,但如果我收到一条具有相同主键的消息,我会得到一个无法插入异常。如果我得到一个具有相同主键的记录,是否有必要设置Jpa将插入转换为更新

from("jms:queue:myqueue")
    .unmarshal(myGsonDataFormat)
    .convertBodyTo(MyDBEntity.class)
    .to("jpa:" + MyDBEntity.class.getName());

@Entity
@Table(name = "MyTableName")
public class MyDBEntity {
    @Id
    @Column(name = "column1", length =2)
    private String column1;

    @Column(name = "column2", length =2)
    private String column2;

}
堆栈跟踪:

2016-03-15 15:12:04,766 [imer://fireOnce] ERROR DefaultErrorHandler            - Failed delivery for (MessageId: ID-WKSP000675FB-51972-1458069119050-0-5 on ExchangeId: ID-WKSP000675FB-51972-1458069119050-0-6). Exhausted after delivery attempt: 1 caught: <openjpa-2.4.1-r422266:1730418 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: Attempt to change a primary key field of an instance that already has a final object id.  Only new, unflushed instances whose id you have not retrieved can have their primary keys changed.
FailedObject: com.ups.ops.cipe.external.route.entity.RouteEntity-0000003
堆栈跟踪

---------------------------------------------------------------------------------------------------------------------------------------
<openjpa-2.4.1-r422266:1730418 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: Attempt to change a primary key field of an instance that already has a final object id.  Only new, unflushed instances whose id you have not retrieved can have their primary keys changed.
FailedObject: com.ups.ops.cipe.external.route.entity.RouteEntity-0000003
    at org.apache.openjpa.kernel.StateManagerImpl.assertNoPrimaryKeyChange(StateManagerImpl.java:2185)
    at org.apache.openjpa.kernel.StateManagerImpl.settingStringField(StateManagerImpl.java:2166)
    at org.apache.openjpa.kernel.AttachStrategy.attachField(AttachStrategy.java:179)
    at org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:166)
    at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:252)
    at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:105)
    at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3508)
    at org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1213)
    at org.apache.openjpa.persistence.EntityManagerImpl.merge(EntityManagerImpl.java:879)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
    at com.sun.proxy.$Proxy69.merge(Unknown Source)
    at org.apache.camel.component.jpa.JpaProducer$1.save(JpaProducer.java:102)
    at org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:78)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
    at org.apache.camel.component.jpa.JpaProducer.process(JpaProducer.java:61)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:167)
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:304)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:162)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:662)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:590)
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237)
    at org.apache.camel.processor.Splitter.process(Splitter.java:104)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:662)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:590)
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237)
    at org.apache.camel.processor.Splitter.process(Splitter.java:104)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:165)
    at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:73)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.openjpa.persistence.InvalidStateException:尝试更改已具有最终对象id的实例的主键字段。只有尚未检索到其id的新的未刷新实例才能更改其主键。
故障对象:com.ups.ops.cipe.external.route.entity.RouteEntity-0000003
位于org.apache.openjpa.kernel.StateManagerImpl.assertNoPrimaryKeyChange(StateManagerImpl.java:2185)
位于org.apache.openjpa.kernel.StateManagerImpl.settingStringField(StateManagerImpl.java:2166)
位于org.apache.openjpa.kernel.AttachStrategy.attachField(AttachStrategy.java:179)
位于org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:166)
位于org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:252)
位于org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:105)
位于org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3508)
位于org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1213)
位于org.apache.openjpa.persistence.EntityManagerImpl.merge(EntityManagerImpl.java:879)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)中
位于java.lang.reflect.Method.invoke(Method.java:497)
位于org.springframework.orm.jpa.ExtendedEntityManagerCreator$extendedentitymanageringhandler.invoke(ExtendedEntityManagerCreator.java:366)
位于com.sun.proxy.$Proxy69.merge(未知源)
位于org.apache.camel.component.jpa.JpaProducer$1.save(JpaProducer.java:102)
位于org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:78)
位于org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
位于org.apache.camel.component.jpa.JpaProducer.process(JpaProducer.java:61)
位于org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
位于org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:167)
位于org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:304)
位于org.apache.camel.processor.SendProcessor.process(SendProcessor.java:162)
位于org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:448)
位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
位于org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
位于org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:448)
位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
位于org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:662)
位于org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:590)
位于org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237)
位于org.apache.camel.processor.Splitter.process(Splitter.java:104)
位于org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:448)
位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
位于org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
位于org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:448)
位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
位于org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:662)
位于org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:590)
位于org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237)
位于org.apache.camel.processor.Splitter.process(Splitter.java:104)
位于org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
位于org.apache.camel.processor.RedeliveryRorHandler.process(RedeliveryRorHandler.java:448)
位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
位于org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
位于org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
位于org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
位于org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:165)
位于org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:73)
位于java.util.TimerThread.mainLoop(Timer.java:555)
在java.util.TimerThread.run(Timer.java:505)

您可以尝试使用参数
usePersist=false

usePersist:Camel 2.5:JPA producer only:指示使用 entityManager.persist(实体)而不是entityManager.merge(实体)。 注意:entityManager.persist(实体
---------------------------------------------------------------------------------------------------------------------------------------
<openjpa-2.4.1-r422266:1730418 nonfatal user error> org.apache.openjpa.persistence.InvalidStateException: Attempt to change a primary key field of an instance that already has a final object id.  Only new, unflushed instances whose id you have not retrieved can have their primary keys changed.
FailedObject: com.ups.ops.cipe.external.route.entity.RouteEntity-0000003
    at org.apache.openjpa.kernel.StateManagerImpl.assertNoPrimaryKeyChange(StateManagerImpl.java:2185)
    at org.apache.openjpa.kernel.StateManagerImpl.settingStringField(StateManagerImpl.java:2166)
    at org.apache.openjpa.kernel.AttachStrategy.attachField(AttachStrategy.java:179)
    at org.apache.openjpa.kernel.VersionAttachStrategy.attach(VersionAttachStrategy.java:166)
    at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:252)
    at org.apache.openjpa.kernel.AttachManager.attach(AttachManager.java:105)
    at org.apache.openjpa.kernel.BrokerImpl.attach(BrokerImpl.java:3508)
    at org.apache.openjpa.kernel.DelegatingBroker.attach(DelegatingBroker.java:1213)
    at org.apache.openjpa.persistence.EntityManagerImpl.merge(EntityManagerImpl.java:879)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:366)
    at com.sun.proxy.$Proxy69.merge(Unknown Source)
    at org.apache.camel.component.jpa.JpaProducer$1.save(JpaProducer.java:102)
    at org.apache.camel.component.jpa.JpaProducer$1.doInTransaction(JpaProducer.java:78)
    at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:131)
    at org.apache.camel.component.jpa.JpaProducer.process(JpaProducer.java:61)
    at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61)
    at org.apache.camel.processor.SendProcessor$2.doInAsyncProducer(SendProcessor.java:167)
    at org.apache.camel.impl.ProducerCache.doInAsyncProducer(ProducerCache.java:304)
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:162)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:662)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:590)
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237)
    at org.apache.camel.processor.Splitter.process(Splitter.java:104)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:662)
    at org.apache.camel.processor.MulticastProcessor.doProcessSequential(MulticastProcessor.java:590)
    at org.apache.camel.processor.MulticastProcessor.process(MulticastProcessor.java:237)
    at org.apache.camel.processor.Splitter.process(Splitter.java:104)
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77)
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:121)
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83)
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191)
    at org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:165)
    at org.apache.camel.component.timer.TimerConsumer$1.run(TimerConsumer.java:73)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)
from("jms:queue:myqueue")
    .unmarshal(myGsonDataFormat)
    .convertBodyTo(MyDBEntity.class)
    .to("jpa:" + MyDBEntity.class.getName()+"?usePersist=false&flushOnSend=true&joinTransaction=true");