2017-01-10 3 views
0

Я вижу следующую ошибку при обновлении моего приложения с hibernate 5.1 до 5.2.6. В частности, это весна 4.3.5.Hibernate 5.2 и Spring 4.3, Non 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) 

Как вы можете видеть в стеке след ниже, весной явно начал транзакцию, и на самом деле пытается вызвать флеш перед совершением это сделка. Похоже, что код, который синхронизирует спящие и весенние транзакции, не работает с hibernate 5.2 (выглядит в конце org.springframework.orm.hibernate5.SpringSessionContext.currentSession()). Является ли это открытой ошибкой, или я где-то пропускаю конфиг?

+0

По-видимому, он еще не начал транзакцию иначе исключение не произойдет. Можете ли вы добавить часть своей конфигурации? Также почему использование LDAP приведет к исключению с транзакцией с гибернацией ?! –

+0

Получили ли вы что-нибудь с этим? Я вижу ту же проблему (и снова * определенно * запускаю транзакцию, обратите внимание, что метод 'org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction' находится в стеке вызовов ...). Это похоже на ошибку, но [только связанный отчет об ошибках, который я могу найти в JIRA Spring) (https://jira.spring.io/browse/SPR-14364), по-видимому, был исправлен и выпущен в 4.3.3, поэтому не должно быть проблемой здесь. – Jules

+0

Итак, мне нужно было пройти через него, поэтому я перешел в 'org.springframework.transaction.jta.JtaTransactionManager'. Это работало так, как ожидалось, позволяя одной транзакции делиться между несколькими источниками данных, хотя она была чрезмерной, поскольку мы используем только один источник данных. К сожалению, менеджер 'hibernate5.HibernateTransactionManager', предложенный @Jules, не будет работать для нас из-за того, что у нас есть несколько сессионных заводов, но это может сработать для вас. – laoseth

ответ

1

В моем случае проблема была вызвана старым параметром конфигурации с использованием реализации Spring JDBC TransactionManager, а не соответствующей интегрированной Hibernate. Это было очевидно для 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

Мы столкнулись с той же проблемой, я нашел другую причину этого.

Весна 4.3.9, Hibernate 5.2.10 с конфигурацией XML & Декларативная транзакция. Проблема была SetReadOnly() помещен в неправильном месте в транзакции, она устанавливает после getTransaction()

код с ошибкой:

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

Изменения в коде выше для фиксации вопроса:

DefaultTransactionDefinition transactionDefinition = new DefaultTransactionDefinition(); 
transactionDefinition.setReadOnly(true); 
transactionStatus = transactionManager.getTransaction(transactionDefinition); 
//DAO Call 
transactionManager.commit(transactionStatus); 
0

Я столкнулся с такой же проблемой при обновлении устаревшего приложения, которое поддерживается конфигурацией Spring XML.

Следующие свойств Hibernate должны были быть добавлены к конфигурации Пружины LocalSessionFactory:

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

Причина, как представляется, что в спящем режиме 5.2 значение по умолчанию для hibernate.transaction.coordinator_class является JDBC для приложений, не являющиеся JPA , И это плохо работает с транзакциями Spring.

Смежные вопросы