[Transaction] Problème avec TransactionProxyFactoryBean
Bonjour,
j'ai un problème avec "org.springframework.transaction.interceptor.Trans actionProxyFactoryBean"
D'après ce que j'ai compris, cette classe permet de gérer les transactions pour un service. Voici comment je l'utilise :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
|
<bean id="quickSearchManagementService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="myTxManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
<property name="target">
<bean class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="target"><ref bean="quickSearchManagementServiceTarget"/></property>
<property name="proxyInterfaces">
<value>com.flexcipio.clinical.service.QuickSearchManagementService</value>
</property>
<property name="interceptorNames">
<list>
<value>methodSecurityInterceptor</value>
</list>
</property>
</bean>
</property>
</bean> |
et voici ma classe d'implémentation cible :
Code:
1 2 3 4 5
|
<bean id="quickSearchManagementServiceTarget" class="com.flexcipio.clinical.service.impl.QuickSearchManagementServiceImpl">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
<property name="formDao"><ref bean="formDao"/></property>
</bean> |
A l'intérieur de mon implémentation, j'ai besoin d'une transaction que je veux commiter pour prendre en compte des changements :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
public List<Form> searchForm(String search, User user) {
...............................
...............................
Transaction tx = sessionFactory.getCurrentSession().beginTransaction();
List<Form> forms = formDao.findByAll();
for ( Form form : forms) {
String formName = form.getName();
form.setName(formName+"1");
formDao.update(form);
}
tx.commit();
..............................
..............................
} |
Et j'ai l'erreur suivante :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
org.hibernate.TransactionException: Transaction not successfully started
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:100)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:655)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
at $Proxy89.searchForm(Unknown Source)
at com.clinical.web.controller.impl.QuickSearchManagementControllerImpl.getQuickSearch(QuickSearchManagementControllerImpl.java:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.springframework.web.servlet.mvc.multiaction.MultiActionController.invokeNamedMethod(MultiActionController.java:473)
at org.springframework.web.servlet.mvc.multiaction.MultiActionController.handleRequestInternal(MultiActionController.java:410)
at org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
at org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:48)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:809)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) |
Je ne sais pas ce qui se passe. Apparamment, je ne peux pas ouvrir une transaction à l'intérieur d'une méthode de mon service de manière à mettre à jour des données puis commiter la transaction de manière à ce que mes changements soient pris en compte. TransactionProxyFactoryBean semble interdire ceci. Est-ce que quelqu'un peut me dire ce que je peux faire pour utiliser une transaction dans une méthode de mon service et la commiter sans erreur ? Je ne comprend rien à cette histoire de transaction. Merci à l'avance si vous pouvez me donner le maximum d'informations.