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]