【发布时间】:2018-08-01 09:19:45
【问题描述】:
我将 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 注入服务类并调用更新方法。 但是在这里,当骆驼路线开始时,我得到以下异常:
2018-02-21 15:38:09,807 |警告 | ://purge材料 |交易 | 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] 在 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] 在 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 注释,一切正常。这应该与路线中的交易声明有关。 有什么想法吗????
【问题讨论】:
标签: java hibernate apache-camel apache-karaf