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)
Können Sie überprüfen, was der Typ der Klasse ist, die Sie erhalten über factory.getCurrentSession() –
versuchen, Schnittstelle für genericDao zu machen, und implementieren Sie es dann. oder fügen Sie @Transactional zu getAll (..) hinzu – Sarief
Können Sie einen Stacktrace veröffentlichen? –