2016-03-15 121 views
1

使用類似於下面的代碼時,只要我從來沒有記錄與前一記錄相同的主鍵進入,一切都可以,但如果我遇到了一個情況,我得到的同一個主鍵不能插入異常。無論如何設置Jpa將插入轉換爲更新,如果我得到一個具有相同主鍵的記錄?駱駝JMS更新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 

消息歷史記錄

--------------------------------------------------------------------------------------------------------------------------------------- 
RouteId    ProcessorId   Processor                  Elapsed (ms) 
[PackageCarStatusRo] [PackageCarStatusRo] [timer://fireOnce?repeatCount=1            ] [  3763] 
[PackageCarStatusRo] [log2    ] [log                   ] [   0] 
[PackageCarStatusRo] [PersistRouteEntity] [jpa:com.ups.ops.cipe.external.route.entity.RouteEntity      ] [  2354] 

Exchange 
--------------------------------------------------------------------------------------------------------------------------------------- 
Exchange[ 
    Id     ID-WKSP000675FB-51972-1458069119050-0-6 
    ExchangePattern  InOnly 
    Headers    {breadcrumbId=ID-WKSP000675FB-51972-1458069119050-0-1, CamelRedelivered=false, CamelRedeliveryCounter=0, firedTime=Tue Mar 15 15:12:00 EDT 2016} 
    BodyType   com.ups.ops.cipe.external.route.entity.RouteEntity 
    Body    RouteEntity [driverId=0000003 , countryCode=US, slic=2029, lastUpdateTime=Tue Mar 15 15:12:02 EDT 2016, driverName=D3, routeName=07, allStopCompleted=0.0, allStopTotal=0.0, puPkgsCompleted=0.0, percentComplete=0.0] 
] 

堆棧跟蹤

--------------------------------------------------------------------------------------------------------------------------------------- 
<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) 
+0

請張貼異常的堆棧跟蹤。 –

+0

@DraganBozanovic更新了一個例外。注意:我使用OpenJPA 2.4.1作爲我的實施 –

+0

這不是堆棧跟蹤。 –

回答

1

你可以嘗試使用參數usePersist=false

usePersist:駱駝2.5:JPA生產者只:表示使用 entityManager.persist(實體)代替entityManager.merge(實體)。 注意:entityManager.persist(entity)不適用於分離的實體 (其中EntityManager必須執行UPDATE而不是INSERT 查詢)!

from("jms:queue:myqueue") 
    .unmarshal(myGsonDataFormat) 
    .convertBodyTo(MyDBEntity.class) 
    .to("jpa:" + MyDBEntity.class.getName()+"?usePersist=false&flushOnSend=true&joinTransaction=true"); 
+0

當我嘗試這樣做時:嘗試更改已有最終對象ID的實例的主鍵字段。只有新的未刷新的實例(其ID未檢索到)可以更改其主鍵。 –

+0

我已更新我的帖子,嘗試添加另外兩個參數:'flushOnSend = true&joinTransaction = true' –

+0

我剛剛嘗試了以下更改,並且看到相同的錯誤。這段代碼可能會有不同的反應,因爲我把它放在分隔標籤中?完整的實現將「convertBodyTo」替換爲返回一個列表的bean,然後在方法調用 –