2016-10-22 13 views
2

私はSpring管理トランザクションで動作する休止状態を取得しようとしています。私が何をするにしても、私はいつも「取引は進行中ではありません」という例外を受けます。私は理解していない唯一のものはこれです:私は私の@Transactional方法でsessionFactory.getCurrentSession()を呼び出さない場合は、すべてがうまく行くと、私はHibernateTransactionManager取引ライフサイクルメソッドが呼び出されて見ることができますHibernate Spring Transactionalトランザクションが実行されていません

- などdoGetTransaction(...), doCommit(...)をし、エラーがスローされません。私は私の方法でsessionFactory.getCurrentSession()を追加すると

私はまだdoGetTransaction()(明らか)を参照してください、しかし、すぐにgetCurrentSession()は私がdoRollback()を見て始めていると最終的に私が取得していますと呼ばれるように例外「はトランザクションが進行中でありません」。私はすでに一日を費やしています。しようとすると、私は考えることができます基本的にすべてのトランザクションの範囲、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); 
    } 
} 
バージョン(4.3.3それぞれ5.2.3)

applicationContext.xmlを最新のスプリングを使用して休止状態

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

明らかに問題がHotswapAgentでのJava DCEVMを用いています。私がtomcat実行コンフィギュレーションから-XXaltjvm=dcevm -javaagent:C:\hotswap-agent.jarを削除すると、すべてが期待通りに機能します。私はこれが "ハッピー"なソフトウェアを使用することの副作用の一つだと思います。これらのことに関する私の知識は、実際の問題が何であるかを推測しようとするには小さすぎます。

関連する問題