IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

[Transaction] Problème avec TransactionProxyFactoryBean


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut [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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre expérimenté Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Par défaut
    Cette technique de proxy sert à gérer automatiquement les transactions (mode required), à l'aide de ton transactionManager. Tu ne dois donc démarrer, ni valider, explicitement la transaction hibernate.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    729
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 729
    Par défaut
    Bonjour et merci de ta réponse.
    Je dois inpérativement demarer et valider explicitement une transaction hibernate. N'y a t-il pas un moyen de s'en sortir autrement ? Ou est-ce que je dois utiliser autre chose que TransactionProxyFactoryBean ?

  4. #4
    Membre expérimenté Avatar de sewatech
    Inscrit en
    Février 2007
    Messages
    141
    Détails du profil
    Informations personnelles :
    Âge : 55

    Informations forums :
    Inscription : Février 2007
    Messages : 141
    Par défaut
    J'ai du mal à comprendre pourquoi tu dois démarrer la transaction manuellement, si Spring le fait pour toi. Ce type de besoin cache souvent un défaut d'architecture. Admettons, tout de même.

    Dans ce cas, tu as deux possibilité :
    • Ne pas du tout utiliser les transactions de Spring
    • Utiliser manuellement le transactionManager de Spring


    Dans la première solution, tu utilises juste les objets d'hibernate, sans proxy ni transaction manager de Spring.

    Dans la deuxième solution, tu vires le proxy et tu injectes le transaction manager dans ton bean, puis tu en utilises les méthodes de démarrage, de validation et d'annulation de transaction.

Discussions similaires

  1. [Transact-SQL] Problème avec "execute" dans un "if"
    Par dj_lil dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/12/2007, 15h56
  2. probléme avec les transaction
    Par amazircool dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/12/2007, 16h44
  3. Problème avec transactions concurrentes
    Par QAYS dans le forum Connexion aux bases de données
    Réponses: 2
    Dernier message: 01/03/2007, 22h01
  4. problème avec les transactions
    Par Invité dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/07/2005, 11h43
  5. Problème avec des transaction
    Par Oluha dans le forum ASP
    Réponses: 16
    Dernier message: 01/03/2005, 15h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo