2017-01-10 4 views
0

アプリケーションを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()の末尾にあるように見えます)で動作していないようです。これはオープンなバグですか、どこかで設定をミスしていますか?

+0

明らかにトランザクションを開始していない場合は、例外は発生しません。いくつかの設定を追加できますか?また、LDAPを使用すると、休止状態のトランザクションで例外が発生するのはなぜですか? –

+0

これでどこにいらっしゃいましたか?私は同じ問題を抱えています(そしてまた、*間違いなく*トランザクションを開始してください、 'org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction'メソッドがコールスタック上にあることに注意してください)。これはバグですが、[SpringのJIRA(https://jira.spring.io/browse/SPR-14364)で見つかる関連のバグレポートのみが修正され、4.3.3でリリースされました。ここでは問題ではありません。 – Jules

+0

私はそれを理解する必要があったので、私は 'org.springframework.transaction.jta.JtaTransactionManager'に移動しました。これは期待どおりに機能し、複数のデータソース間で単一のトランザクションを共有できるようになりましたが、1つのデータソースのみを使用するため、過度の作業でした。残念ながら、@ Julesによって提案された 'hibernate5.HibernateTransactionManager'マネージャは、複数のセッションファクトリを持つ私たちのためにはうまくいかないでしょうが、あなたのために働くかもしれません。 – laoseth

答えて

1

私の場合、この問題は、適切なHibernate統合型ではなく、SpringのJDBC TransactionManager実装を使用する古い構成設定によって発生していました。これはHibernate 4.1では明らかに受け入れられましたが、5.2では受け入れられませんでした。修正プログラムは、私にトランザクションマネージャ豆の宣言を変更することでした:私たちは同じ問題に直面している

<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 
0

、私はそれのために別の理由を発見しました。

Spring 4.3.9、XML構成のHibernate 5.2.10 &宣言的トランザクション。

DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition(); 
transactionDefinition.setReadOnly(true); 
transactionStatus = transactionManager.getTransaction(transactionDefinition); 
//DAO Call 
transactionManager.commit(transactionStatus); 
0
:問題を修正するために上記のコードで

DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition(); 
transactionStatus = transactionManager.getTransaction(transactionDefinition); 
transactionDefinition.setReadOnly(true); //wrongly set it will not set in transactionstatus 
//DAO Call 
transactionManager.commit(transactionStatus); 

変更: 問題は、トランザクション内の間違った場所に置かれます。またsetReadOnly()は、それがgetTransaction()エラーで

コードの後に​​設定しました

Spring XML設定がサポートするレガシーアプリケーションをアップグレードするときに同じ問題が発生しました。

次のプロパティをHibernateは春LocalSessionFactory構成に追加する必要がありました:

<prop key="hibernate.transaction.coordinator_class">jta</prop> 
<prop key="hibernate.transaction.jta.platform">JBossAS</prop> 

理由は、Hibernateは5.2でhibernate.transaction.coordinator_classのデフォルト値は、非JPAアプリケーション用のJDBCであることのようです。そして、それはSpringトランザクションではうまくいきません。

関連する問題