2016-10-22 5 views
2

Ich versuche, Hibernate mit federführenden Transaktionen arbeiten. Egal, was ich mache, ich bekomme immer die Ausnahme "keine Transaktion läuft". Das einzige, was ich nicht verstehe, ist dies:Hibernate Spring Transaktion keine Transaktion läuft

Wenn ich nicht sessionFactory.getCurrentSession() in meinem @Transactional Methode aufrufen zu tun, alles geht gut, und ich kann HibernateTransactionManager Transaktionslebenszyklus-Methoden aufgerufen werden sehen - doGetTransaction(...), doCommit(...) usw. und kein Fehler ausgelöst.

Als ich sessionFactory.getCurrentSession() in meiner Methode hinzufügen, ich sehe noch doGetTransaction() (natürlich), aber sobald getCurrentSession() genannt Ich fange doRollback() und am Ende zu sehen, ich bin immer ‚keine Transaktion im Gange ist‘ Ausnahme. Ich habe schon den ganzen Tag damit verbracht, hoffe, dass jemand hilft. Versucht, den Transaktionsumfang zu ändern, XML-Konfiguration, im Grunde alles, was mir einfällt. Mit neuestem Spring und Hibernate-Versionen (4.3.3 und 5.2.3 jeweils)

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); 
    } 
} 

HalloController.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; 
    } 
} 

feder 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> 

Stacktrace:

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

Können Sie überprüfen, was der Typ der Klasse ist, die Sie erhalten über factory.getCurrentSession() –

+0

versuchen, Schnittstelle für genericDao zu machen, und implementieren Sie es dann. oder fügen Sie @Transactional zu getAll (..) hinzu – Sarief

+0

Können Sie einen Stacktrace veröffentlichen? –

Antwort

2

Anscheinend ist das Problem Java DCEVM mit HotswapAgent in Verwendung. Wenn ich -XXaltjvm=dcevm -javaagent:C:\hotswap-agent.jar von Tomcat Run-Konfiguration entfernen, funktioniert alles wie erwartet. Ich denke, das ist eine der Nebenwirkungen von "Hacky" -Software. Mein Wissen in diesen Dingen ist zu klein, um zu versuchen, das eigentliche Problem zu erraten.

Verwandte Themen