アプリケーションをhibernate 5.1から5.2.6にアップグレードすると、次のエラーが発生します。具体的には、これはSpring 4.3.5です。Hibernate 5.2およびSpring 4.3、JPA以外 - javax.persistence.TransactionRequiredException:トランザクションが実行されていません
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)
あなたは以下のスタックトレースで見ることができるように、春は明らかにトランザクションを開始している、そして実際に、それは、トランザクションのコミットする前にフラッシュをトリガしようとしています。休止状態とばねトランザクションを同期させるコードは、休止状態の5.2(org.springframework.orm.hibernate5.SpringSessionContext.currentSession()
の末尾にあるように見えます)で動作していないようです。これはオープンなバグですか、どこかで設定をミスしていますか?
明らかにトランザクションを開始していない場合は、例外は発生しません。いくつかの設定を追加できますか?また、LDAPを使用すると、休止状態のトランザクションで例外が発生するのはなぜですか? –
これでどこにいらっしゃいましたか?私は同じ問題を抱えています(そしてまた、*間違いなく*トランザクションを開始してください、 'org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction'メソッドがコールスタック上にあることに注意してください)。これはバグですが、[SpringのJIRA(https://jira.spring.io/browse/SPR-14364)で見つかる関連のバグレポートのみが修正され、4.3.3でリリースされました。ここでは問題ではありません。 – Jules
私はそれを理解する必要があったので、私は 'org.springframework.transaction.jta.JtaTransactionManager'に移動しました。これは期待どおりに機能し、複数のデータソース間で単一のトランザクションを共有できるようになりましたが、1つのデータソースのみを使用するため、過度の作業でした。残念ながら、@ Julesによって提案された 'hibernate5.HibernateTransactionManager'マネージャは、複数のセッションファクトリを持つ私たちのためにはうまくいかないでしょうが、あなたのために働くかもしれません。 – laoseth