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 qui ne semble pas utilisée


Sujet :

Spring Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 78
    Points : 62
    Points
    62
    Par défaut [Hibernate] Transaction qui ne semble pas utilisée
    Bonjour,

    Je commence un nouveau projet Sping/Hibernate, Spring est censé gérer mes transactions.

    J'ai donc une classe UserHelper dont la méthode writeTest est rendue transactionnelle.

    Mon soucis est que si je vois bien une session s'ouvrir et une transaction commencer dans les logs, celle-ci ne semble pas "visible", la moindre action sur la session provoque alors une exception.

    Le plus étonnant est que si je modifier ma méthode writeTest à la main pour ouvrir une session et une transaction alors tout se passe bien (le code ci-dessous contient cette modification en commentaire).

    Ce n'est pas mon premier projet Hibernate/Spring, c'est pourquoi je comprends d'autant moins mon bug... mais là je sèche depuis 2 jours ^^

    Voici mes sources :

    hibernate.cfg.xml
    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
    <hibernate-configuration>
        <session-factory name="sessionFactory2">
    		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/Centralisateur</property>
    		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.username">centralisateur</property>
            <property name="hibernate.connection.password">centralisateur</property>
     
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
            <property name="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property>
            <property name="hibernate.show_sql">false</property>        
            <property name="hibernate.current_session_context_class">thread</property>
            <!-- <property name="hibernate.connection.pool_size">1</property> -->
     
            <mapping class="jkt.centralisateur.storage.model.Profile" />
            <mapping class="jkt.centralisateur.storage.model.User" />
        </session-factory>
    </hibernate-configuration>
    LogginController.java
    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
    public class LoginController implements Controller {
    	static final Logger log = Logger.getLogger(LoginController.class);
     
    	private UserHelper userHelper;
     
    	public ModelAndView handleRequest(final HttpServletRequest request,
    								      final HttpServletResponse response) throws Exception {
    		ModelAndView modelAndView = new ModelAndView("login");
     
    		log.info("AVANT TRANSACTION");
    		userHelper.writeTest();
    		log.info("APRES TRANSACTION");
     
    		return modelAndView;
    	}
     
    	public void setUserHelper(UserHelper userHelper) {
    		this.userHelper = userHelper;
    	}
    }
    UserHelper.java
    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
    27
    28
    29
    30
    31
    32
    33
    34
    public class UserHelper {
    	static final Logger log = Logger.getLogger(UserHelper.class);
     
    	private SessionFactory sessionFactory;
     
    	public void writeTest() {		
    		log.info("DEBUT TRANSACTION");
     
    		Session session = sessionFactory.getCurrentSession();
    		//Session session = sessionFactory.openSession();
    		//Transaction transaction = session.beginTransaction();
    		log.info("-- 1 SessionFactory : " + sessionFactory);		
     
    		Profile profile = new Profile();
    		log.info("-- 2");
     
    		profile.setNom("Coucou");
    		log.info("-- 3");
     
    		log.error("SESSION : " + session.hashCode());
     
    		session.persist(profile);
    		log.info("-- 4");
     
    		//transaction.commit();
    		//session.close();
     
    		log.info("FIN TRANSACTION");
    	}
     
    	public void setSessionFactory(SessionFactory sessionFactory) {
    		this.sessionFactory = sessionFactory;
    	}
    }
    applicationContext.xml
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
        <!-- Session factory  -->
        <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
            <property name="configLocation">
                <value>classpath:hibernate.cfg.xml</value>
            </property>
            <property  name="configurationClass">
                 <value>org.hibernate.cfg.AnnotationConfiguration</value>
            </property>
        </bean>
     
        <!-- Transaction manager -->
        <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
            <property name="sessionFactory" ref="sessionFactory"/>
            <property name="nestedTransactionAllowed" value="true" />
        </bean>
     
        <bean id="transactionProxy" 
            class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
            abstract="true">
            <property name="transactionManager" ref="transactionManager" />
        </bean>
     
        <!-- DAOs -->
        <bean id="profileDao" class="jkt.centralisateur.storage.model.ProfileHome"></bean>
     
        <!-- Helpers -->
        <bean id="userHelper" class="jkt.centralisateur.storage.helper.UserHelper" >
        	<property name="sessionFactory" ref="sessionFactory" />
        </bean>
     
        <bean id="userHelperProxy" parent="transactionProxy">
            <property name="target" ref="userHelper" />
            <property name="transactionAttributes">
                <props>
                    <prop key="*">PROPAGATION_REQUIRED</prop>
                </props>
            </property>
        </bean>
     
        <bean id="loginController" class="jkt.centralisateur.controller.LoginController">
            <property name="userHelper"><ref bean="userHelperProxy" /></property>
        </bean>
    logs
    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    2008-07-13 18:33:35,312 [ http-8080-1] INFO  jkt.centralisateur.controller.LoginController - LoginController.java:22   - AVANT TRANSACTION
    2008-07-13 18:33:35,343 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - AbstractPlatformTransactionManager.java:346  - Using transaction object [org.springframework.orm.hibernate3.HibernateTransactionManager$HibernateTransactionObject@1d36fa0]
    2008-07-13 18:33:35,343 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - AbstractPlatformTransactionManager.java:374  - Creating new transaction with name [jkt.centralisateur.storage.helper.UserHelper.writeTest]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT
    2008-07-13 18:33:35,421 [ http-8080-1] DEBUG org.hibernate.impl.SessionImpl - SessionImpl.java:220  - opened session at timestamp: 12159668153
    2008-07-13 18:33:35,421 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - HibernateTransactionManager.java:496  - Opened new Session [org.hibernate.impl.SessionImpl@58d1a4] for Hibernate transaction
    2008-07-13 18:33:35,437 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - HibernateTransactionManager.java:526  - Not preparing JDBC Connection of Hibernate Session [org.hibernate.impl.SessionImpl@58d1a4]
    2008-07-13 18:33:35,437 [ http-8080-1] DEBUG org.hibernate.transaction.JDBCTransaction - JDBCTransaction.java:54   - begin
    2008-07-13 18:33:35,437 [ http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - ConnectionManager.java:421  - opening JDBC connection
    2008-07-13 18:33:35,437 [ http-8080-1] DEBUG org.hibernate.transaction.JDBCTransaction - JDBCTransaction.java:59   - current autocommit status: false
    2008-07-13 18:33:35,437 [ http-8080-1] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager - TransactionSynchronizationManager.java:186  - Bound value [org.springframework.orm.hibernate3.SessionHolder@68e6bf] for key [org.hibernate.impl.SessionFactoryImpl@100c0aa] to thread [http-8080-1]
    2008-07-13 18:33:35,437 [ http-8080-1] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager - TransactionSynchronizationManager.java:261  - Initializing transaction synchronization
    2008-07-13 18:33:35,453 [ http-8080-1] INFO  jkt.centralisateur.storage.helper.UserHelper - UserHelper.java:15   - DEBUT TRANSACTION
    2008-07-13 18:33:35,453 [ http-8080-1] DEBUG org.hibernate.impl.SessionImpl - SessionImpl.java:220  - opened session at timestamp: 12159668154
    2008-07-13 18:33:35,640 [ http-8080-1] INFO  jkt.centralisateur.storage.helper.UserHelper - UserHelper.java:20   - -- 1 SessionFactory : org.hibernate.impl.SessionFactoryImpl@100c0aa
    2008-07-13 18:33:35,640 [ http-8080-1] INFO  jkt.centralisateur.storage.helper.UserHelper - UserHelper.java:23   - -- 2
    2008-07-13 18:33:35,640 [ http-8080-1] INFO  jkt.centralisateur.storage.helper.UserHelper - UserHelper.java:26   - -- 3
    2008-07-13 18:33:35,640 [ http-8080-1] ERROR jkt.centralisateur.storage.helper.UserHelper - UserHelper.java:28   - SESSION : 20437425
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - AbstractPlatformTransactionManager.java:893  - Triggering beforeCompletion synchronization
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - AbstractPlatformTransactionManager.java:798  - Initiating transaction rollback
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - HibernateTransactionManager.java:670  - Rolling back Hibernate transaction on Session [org.hibernate.impl.SessionImpl@58d1a4]
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.hibernate.transaction.JDBCTransaction - JDBCTransaction.java:152  - rollback
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.hibernate.transaction.JDBCTransaction - JDBCTransaction.java:163  - rolled back JDBC Connection
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - ConnectionManager.java:404  - aggressively releasing JDBC connection
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.hibernate.jdbc.ConnectionManager - ConnectionManager.java:441  - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - AbstractPlatformTransactionManager.java:922  - Triggering afterCompletion synchronization
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager - TransactionSynchronizationManager.java:315  - Clearing transaction synchronization
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.transaction.support.TransactionSynchronizationManager - TransactionSynchronizationManager.java:232  - Removed value [org.springframework.orm.hibernate3.SessionHolder@68e6bf] for key [org.hibernate.impl.SessionFactoryImpl@100c0aa] from thread [http-8080-1]
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.HibernateTransactionManager - HibernateTransactionManager.java:730  - Closing Hibernate Session [org.hibernate.impl.SessionImpl@58d1a4] after transaction
    2008-07-13 18:33:35,656 [ http-8080-1] DEBUG org.springframework.orm.hibernate3.SessionFactoryUtils - SessionFactoryUtils.java:774  - Closing Hibernate Session
    2008-07-13 18:33:35,671 [ http-8080-1] DEBUG org.springframework.web.servlet.DispatcherServlet - DispatcherServlet.java:939  - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@fc912
    2008-07-13 18:33:35,687 [ http-8080-1] DEBUG org.springframework.web.servlet.DispatcherServlet - FrameworkServlet.java:588  - Could not complete request
    org.hibernate.HibernateException: persist is not valid without active transaction
    	at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297)
    	at $Proxy8.persist(Unknown Source)
    	at jkt.centralisateur.storage.helper.UserHelper.writeTest(UserHelper.java:30)
    	at jkt.centralisateur.storage.helper.UserHelper$$FastClassByCGLIB$$3bff5b83.invoke(<generated>)
    	at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149)
    	at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2AopProxy.java:700)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149)
    	at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
    	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    	at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
    	at jkt.centralisateur.storage.helper.UserHelper$$EnhancerByCGLIB$$a03e5812.writeTest(<generated>)
    	at jkt.centralisateur.controller.LoginController.handleRequest(LoginController.java:23)
    	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)
    	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
    	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
    	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
    	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
    	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
    	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
    	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
    	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
    	at java.lang.Thread.run(Unknown Source)
    2008-07-13 18:33:35,687 [ http-8080-1] DEBUG org.springframework.web.context.support.XmlWebApplicationContext - AbstractApplicationContext.java:273  - Publishing event in context [org.springframework.web.context.support.XmlWebApplicationContext@147f330]: ServletRequestHandledEvent: url=[/Centralisateur/login.html]; client=[127.0.0.1]; method=[GET]; servlet=[dispatcherServlet]; session=[0D817D1A6F99FEE62A64C65C825CAE33]; user=[null]; time=[406ms]; status=[failed: org.hibernate.HibernateException: persist is not valid without active transaction]
    2008-07-13 18:33:35,687 [ http-8080-1] DEBUG org.springframework.web.context.support.XmlWebApplicationContext - AbstractApplicationContext.java:273  - Publishing event in context [org.springframework.web.context.support.XmlWebApplicationContext@ea3cdf]: ServletRequestHandledEvent: url=[/Centralisateur/login.html]; client=[127.0.0.1]; method=[GET]; servlet=[dispatcherServlet]; session=[0D817D1A6F99FEE62A64C65C825CAE33]; user=[null]; time=[406ms]; status=[failed: org.hibernate.HibernateException: persist is not valid without active transaction]

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 78
    Points : 62
    Points
    62
    Par défaut
    J'ajoute qu'une chose troublante est que la session semble être ouverte 2 fois de suite. Dans les logs précédents :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    2008-07-13 18:33:35,421 [ http-8080-1] DEBUG org.hibernate.impl.SessionImpl - SessionImpl.java:220  - opened session at timestamp: 12159668153
    ...
    2008-07-13 18:33:35,453 [ http-8080-1] DEBUG org.hibernate.impl.SessionImpl - SessionImpl.java:220  - opened session at timestamp: 12159668154
    ...
    Donc l'ouverture de session semble être faite une première fois par le transactionManager puis une seconde fois par la ligne de code "sessionFactory.getCurrentSession()" de UserHelper, code qui ne devrait pas avoir cet effet (la session étant déjà ouverte).

Discussions similaires

  1. [DOM] Script qui ne semble pas fonctionner sous IE 6 et 7
    Par Oluha dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2007, 16h50
  2. [PDO] et bindValue qui ne semble pas fonctionner
    Par Tommyl dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 31/10/2006, 16h12
  3. Réponses: 3
    Dernier message: 01/06/2006, 16h26
  4. [MySQL] ORDER BY qui ne semble pas pris en compte
    Par yongblood dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/03/2006, 12h53

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