【问题标题】:Hibernate StaleObjectStateException in Karaf with Camel Route使用 Camel Route 在 Karaf 中休眠 StaleObjectStateException
【发布时间】: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&amp;period=2h&amp;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


    【解决方案1】:

    更新:我发现了问题,我刚刚删除了骆驼路线中的交易元素。之前,我使用camel 2.17.x,那里需要transacted元素才能获得交易

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2013-05-04
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      相关资源
      最近更新 更多