2016-10-22 337 views
2

我试图让spring处理spring管理事务。无论我做什么,我都会得到'没有交易正在进行'的例外情况。我不明白的一件事是:Hibernate Spring事务处理没有事务处理正在进行中

如果我不叫我@Transactional方法sessionFactory.getCurrentSession(),一切顺利,我可以看到被称为HibernateTransactionManager交易生命周期方法 - doGetTransaction(...), doCommit(...)等,并不会引发错误。

当我在我的方法添加sessionFactory.getCurrentSession()我仍然看到doGetTransaction()(明显),但只要getCurrentSession()叫我开始看到doRollback(),最后我得到“没有交易正在进行中”的异常。我已经花了整整一天的时间,希望有人帮助。尝试改变事务范围,XML配置,基本上我能想到的一切。它采用了最新的弹簧和休眠(4.3.3和5.2.3分别)版本

的applicationContext.xml:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
    <property name="url" value="jdbc:mysql://localhost:3306/trainings"/> 
    <property name="password" value="xxx"/> 
    <property name="username" value="xxx"/> 
</bean> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
     </props> 
    </property> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

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

<context:annotation-config/> 

<context:component-scan base-package="webtrainings.beans"/> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

GenericDAO.java:

@Repository("genericDao") 
@Scope(value = "singleton") 
public class GenericDAO<T> { 

    @Autowired 
    private SessionFactory sessionFactory; 

    @Autowired 
    private ApplicationContext appContext; 

    public void getAll(Class<T> clazz) { 
     factory.getCurrentSession(); 
    } 
} 

MyService.java:

@Service("myService") 
@Transactional 
public class MyService { 

    @Autowired 
    GenericDAO genericDAO; 

    @Transactional 
    public void hehe() { 
     genericDAO.getAll(Training.class); 
    } 
} 

HelloController.java:

@Controller 
@RequestMapping(value = "/welcome") 
public class HelloController { 

    @Autowired 
    MyService myService; 

    @Autowired 
    ApplicationContext applicationContext; 

    @RequestMapping(method = RequestMethod.GET) 
    public ModelAndView handleRequestInternal(HttpServletRequest request, 
               HttpServletResponse response) throws Exception { 
     ModelAndView model = new ModelAndView("hello"); 
     model.addObject("msg", "hello world"); 
     myService.hehe(); 

     return model; 
    } 
} 

弹簧servlet.xml中(MVC):

<context:component-scan base-package="webtrainings.utils"/> 

<bean id="viewResolver" 
      class="org.springframework.web.servlet.view.InternalResourceViewResolver" > 
     <property name="prefix"> 
      <value>/WEB-INF/jsp/</value> 
     </property> 
     <property name="suffix"> 
      <value>.jsp</value> 
     </property> 
</bean> 

堆栈跟踪:

javax.persistence.TransactionRequiredException: no transaction is in progress 
    org.hibernate.internal.SessionImpl.checkTransactionNeeded(SessionImpl.java:3430) 
    org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1397) 
    org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1393) 
    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:487) 
    org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    webtrainings.beans.MyService$$EnhancerBySpringCGLIB$$3fca725c.hehe(<generated>) 
    webtrainings.utils.HelloController.handleRequestInternal(HelloController.java:32) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:498) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:180) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:440) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:428) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:622) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:729) 
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
+0

你可以检查通过factory.getCurrentSession() –

+0

试图为genericDao创建接口,然后实现它的类的类型。或添加@Transactional getAll(..) – Sarief

+0

你可以发布堆栈跟踪? –

回答

2

显然的问题是在使用Java DCEVM与HotswapAgent。当我从tomcat运行配置中删除-XXaltjvm=dcevm -javaagent:C:\hotswap-agent.jar时,一切都按预期工作。我想这是使用“hacky”软件的副作用之一。我在这些事情上的知识太少,甚至无法猜测实际问题是什么。

相关问题