首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"TransactionRequiredException:没有正在进行的事务“,即使应用了事务拦截器- hibernate-5和spring-4.3

"TransactionRequiredException:没有正在进行的事务“,即使应用了事务拦截器- hibernate-5和spring-4.3
EN

Stack Overflow用户
提问于 2016-10-15 19:12:21
回答 1查看 687关注 0票数 0

即使在使用事务拦截器的情况下,我也要面对这个TransactionRequiredException:

代码语言:javascript
复制
javax.persistence.TransactionRequiredException: no transaction is in progress
at org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3393)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1386)
at org.springframework.orm.hibernate5.SessionFactoryUtils.flush(SessionFactoryUtils.java:144)
at org.springframework.orm.hibernate5.SpringSessionSynchronization.beforeCommit(SpringSessionSynchronization.java:95)
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:932)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:487)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)
at my.pkg.entity.impl.StoreImpl$$EnhancerBySpringCGLIB$$73283c3f.merge(<generated>)
at my.pkg.controller.LoginController.setClient(LoginController.java:243)
at my.pkg.controller.LoginController.setupUserSession(LoginController.java:185)
at my.pkg.controller.LoginController.login(LoginController.java:121)
at my.pkg.controller.LoginController$$FastClassBySpringCGLIB$$d71b2e05.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:651)
at my.pkg.controller.LoginController$$EnhancerBySpringCGLIB$$442b15b7.login(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
............

下面是我使用的代码:

代码语言:javascript
复制
Hibernate-5.2 (hibernate-entitymanager-5.1, hibernate-commons-annotations-5.0.1)
Spring-4.3.3 - (tried 4.3.2 as well, same error)

我的dispatcher -servlet.xml是空的,所有的spring配置都在applicationContext.xml中:

代码语言:javascript
复制
<context:annotation-config />
<context:component-scan base-package="my.pkg.controller, my.pkg.entity"></context:component-scan>
<mvc:annotation-driven enable-matrix-variables="true" content-negotiation-manager="contentNegotiationManager" />
<import resource="db-config.xml" />

db-config.xml包含:

代码语言:javascript
复制
<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="mappingResources">
        <list>
            <value>.......hbm.xml</value>
        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.connection.autocommit">false</prop> 
            <prop key="current_session_context_class">thread</prop >
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
    .......
</bean>

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

<tx:advice id="transactionalAdvice" transaction-manager="transactionManager">
    <tx:attributes> 
        <tx:method name="get*" read-only="true"/>
        <tx:method name="find*" read-only="true"/>
        <tx:method name="*" />  
    </tx:attributes>
</tx:advice>
<aop:config>
    <!-- applying this aop on other job classes -->
</aop:config>

<tx:advice id="traxSupportedAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <tx:method name="*" propagation="SUPPORTS" />
    </tx:attributes>
</tx:advice>
<aop:config>
    <aop:advisor pointcut="execution(* my.pkg.entity.*Home.*(..))" advice-ref="traxSupportedAdvice" />
</aop:config>

我的my.pkg.entity.impl.*Impl类从my.pkg.entity扩展而来。*Home类(我正在使用jboss工具自动生成和Home类),所有*Impl类(不是*Home类)也都用@Transactional注释。*主页在aop中用传播“支持”建议指示。LoginController.setClient()用@Transactional注解。

我不知道我做错了什么或遗漏了什么。我确实试着在SOF和google上搜索,但找不到可以在这里应用的。

如果需要任何其他信息,请让我知道。如果我在这里偏离了任何std/首选配置方法,也请让我知道。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

发布于 2016-10-15 22:39:36

未应用LoginController.setClient的@Transactional批注。因为它是一个bean内部调用。您可以在Stacktrace中看到这一点

代码语言:javascript
复制
at my.pkg.controller.LoginController.setClient(LoginController.java:243)
at my.pkg.controller.LoginController.setupUserSession(LoginController.java:185)
at my.pkg.controller.LoginController.login(LoginController.java:121)

您也许可以从login方法开始。但我没有足够的细节可以告诉你。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40058306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档