我使用Karaf 4.0.9和JPA / Hibernate 4.3.6和Camel 2.18.5。 我有一个类似
的服务类@Transactional
public MyEntity update(MyEntity aentity) {
MyEntity entity = this.entityManager.merge(aentity);
return entity;
}
persistence.xml中的数据源是启用JTA的
<jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=mydb)</jta-data-source>
MyEntity使用JPA @Version强制执行OptimisticLocking。
@Version
@Column(name = "VERSION")
private Long version;
一切正常,例如我们有一个REST端点,它注入了服务类,实体得到了更新。
我们在蓝图中也有一个Camel路由,它以与REST端点相同的方式使用该服务:
<camelContext id="managerCtx" xmlns="http://camel.apache.org/schema/blueprint">
<route id="purge">
<from uri="timer://purgeMaterial?fixedRate=true&period=2h&delay=5000" />
<transacted />
<bean ref="myBean" method="purge" />
</route>
</camelContext>
myBean注入服务类并调用update方法。 但是在这里,当驼峰路线开始时,我得到以下异常:
2018-02-21 15:38:09,807 |警告| :// purgeMaterial |交易| 131 - org.apache.aries.transaction.manager - 1.3.1 |来自beforeCompletion的意外异常;交易将回滚 javax.persistence.OptimisticLockException:行已被另一个事务更新或删除(或未保存的值映射不正确):[MyEntity#11093] 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.wrapStaleStateException(AbstractEntityManagerImpl.java:1785)[238:org.hibernate.entitymanager:4.3.6.Final] 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1705)[238:org.hibernate.entitymanager:4.3.6.Final] 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)[238:org.hibernate.entitymanager:4.3.6.Final] 在org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)[238:org.hibernate.entitymanager:4.3.6.Final] 在org.hibernate.jpa.spi.AbstractEntityManagerImpl $ CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1882)[238:org.hibernate.entitymanager:4.3.6.Final] 在org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:115)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:50)[237:org.hibernate.core:4.3.6.Final] 在org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:527)[131:org.apache.aries.transaction.manager:1.3.1] 在org.apache.geronimo.transaction.manager.TransactionImpl.beforeCompletion(TransactionImpl.java:511)[131:org.apache.aries.transaction.manager:1.3.1] 在org.apache.geronimo.transaction.manager.TransactionImpl.beforePrepare(TransactionImpl.java:413)[131:org.apache.aries.transaction.manager:1.3.1] 在org.apache.geronimo.transaction.manager.TransactionImpl.commit(TransactionImpl.java:262)[131:org.apache.aries.transaction.manager:1.3.1] at org.apache.geronimo.transaction.manager.TransactionManagerImpl.commit(TransactionManagerImpl.java:252)[131:org.apache.aries.transaction.manager:1.3.1] 在org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1023)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1] 在org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:761)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1] 在org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1] 在org.apache.aries.transaction.internal.AriesPlatformTransactionManager.commit(AriesPlatformTransactionManager.java:75)[131:org.apache.aries.transaction.manager:1.3.1] 在org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:150)[217:org.apache.servicemix.bundles.spring-tx:4.3.5.RELEASE_1] 在org.apache.camel.spring.spi.TransactionErrorHandler.doInTransactionTemplate(TransactionErrorHandler.java:176)[137:org.apache.camel.camel-spring:2.18.5] at org.apache.camel.spring.spi.TransactionErrorHandler.processInTransaction(TransactionErrorHandler.java:136)[137:org.apache.camel.camel-spring:2.18.5] 在org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:105)[137:org.apache.camel.camel-spring:2.18.5] 在org.apache.camel.spring.spi.TransactionErrorHandler.process(TransactionErrorHandler.java:114)[137:org.apache.camel.camel-spring:2.18.5] 在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)[135:org.apache.camel.camel-core:2.18.5] 在org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197)[135:org.apache.camel.camel-core:2.18.5] 在org.apache.camel.component.timer.TimerConsumer.sendTimerExchange(TimerConsumer.java:197)[135:org.apache.camel.camel-core:2.18.5] 在org.apache.camel.component.timer.TimerConsumer $ 1.run(TimerConsumer.java:79)[135:org.apache.camel.camel-core:2.18.5] 在java.util.TimerThread.mainLoop(Timer.java:555)[:1.8.0_141] 在java.util.TimerThread.run(Timer.java:505)[:1.8.0_141] 引起:org.hibernate.StaleObjectStateException:行被另一个事务更新或删除(或未保存的值映射不正确):[MyEntity#11093] 在org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2541)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3285)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3183)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3525)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:159)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:463)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:349)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:350)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:56)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1222)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:425)[237:org.hibernate.core:4.3.6.Final] 在org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:110)[237:org.hibernate.core:4.3.6.Final] ......还有21个
如果删除实体的@Version注释,一切正常。这应该与路线中的交易声明有关。 任何想法????
答案 0 :(得分:0)
更新:我发现了问题,我刚刚删除了驼峰路线中的交易元素。之前,我使用过camel 2.17.x,并且需要事务处理元素才能获得交易