【发布时间】:2017-01-10 01:30:41
【问题描述】:
将我的应用程序从休眠 5.1 升级到 5.2.6 时,我看到以下错误。具体来说,这是春季 4.3.5。
javax.persistence.TransactionRequiredException: no transaction is in progress
org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3450)
org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1418)
org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1414)
org.springframework.orm.hibernate5.SessionFactoryUtils.flush(SessionFactoryUtils.java:144)
org.springframework.orm.hibernate5.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:95)
org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:932)
org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)
org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:504)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
com.sun.proxy.$Proxy140.mapUserFromContext(Unknown Source)
org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider.authenticate(AbstractLdapAuthenticationProvider.java:87)
正如您在下面的堆栈跟踪中看到的那样,spring 显然已经启动了一个事务,并且实际上是在提交事务之前尝试触发刷新。似乎同步休眠和弹簧事务的代码不适用于休眠 5.2(看起来位于 org.springframework.orm.hibernate5.SpringSessionContext.currentSession() 的末尾)。这是一个开放的错误,还是我错过了某个地方的配置?
【问题讨论】:
-
显然它还没有开始交易,否则不会发生异常。你能添加一些你的配置吗?另外,为什么使用 LDAP 会导致休眠事务异常?!
-
你在这方面有什么收获吗?我看到了同样的问题(再次肯定有一个事务开始,请注意方法
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction在调用堆栈上......)。这似乎是一个错误,但only related bug report I can find in Spring's JIRA 显然已在 4.3.3 中修复并发布,因此这里不应该成为问题。 -
所以,我需要通过它,所以我搬到了
org.springframework.transaction.jta.JtaTransactionManager。这按预期工作,允许在多个数据源之间共享单个事务,尽管这有点矫枉过正,因为我们只使用一个数据源。不幸的是,@Jules 建议的hibernate5.HibernateTransactionManager经理不适用于我们,因为我们有多个会话工厂,但它可能适合您。
标签: java spring hibernate spring-transactions