Я вижу следующую ошибку при обновлении моего приложения с 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()
). Является ли это открытой ошибкой, или я где-то пропускаю конфиг?
По-видимому, он еще не начал транзакцию иначе исключение не произойдет. Можете ли вы добавить часть своей конфигурации? Также почему использование LDAP приведет к исключению с транзакцией с гибернацией ?! –
Получили ли вы что-нибудь с этим? Я вижу ту же проблему (и снова * определенно * запускаю транзакцию, обратите внимание, что метод 'org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction' находится в стеке вызовов ...). Это похоже на ошибку, но [только связанный отчет об ошибках, который я могу найти в JIRA Spring) (https://jira.spring.io/browse/SPR-14364), по-видимому, был исправлен и выпущен в 4.3.3, поэтому не должно быть проблемой здесь. – Jules
Итак, мне нужно было пройти через него, поэтому я перешел в 'org.springframework.transaction.jta.JtaTransactionManager'. Это работало так, как ожидалось, позволяя одной транзакции делиться между несколькими источниками данных, хотя она была чрезмерной, поскольку мы используем только один источник данных. К сожалению, менеджер 'hibernate5.HibernateTransactionManager', предложенный @Jules, не будет работать для нас из-за того, что у нас есть несколько сессионных заводов, но это может сработать для вас. – laoseth