Salut @ tous !
Je suis confronté à un pb avec Hibernate, Spring et les transactions : "[save|createQuery] is not valid without active transaction". J'utilise une Datasource configurée avec Tomcat, et je veux utiliser AOP pour la gestion des transactions :
Tout semble OK dans les 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 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="mappingResources"> <list> <!--[all my mappings]--> </list> </property> <property name="hibernateProperties"> <value> hibernate.connection.datasource=java:comp/env/jdbc/myapp hibernate.dialect=org.hibernate.dialect.Oracle9Dialect hibernate.current_session_context_class=thread hibernate.transaction.factory_class=org.springframework.orm.hibernate3.SpringTransactionFactory hibernate.show_sql=true </value> </property> </bean> <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="get*" read-only="true" /> <tx:method name="*" isolation="READ_COMMITTED" rollback-for="com.myapp.framework.exception.ManagerException" /> </tx:attributes> </tx:advice> <aop:config> <aop :p ointcut id="pcManager1" expression="execution(public * com.myapp.framework.dao.manager..*(..))" /> <aop :p ointcut id="pcManager2" expression="execution(public * com.myapp.dao.manager..*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="pcManager1" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pcManager2" /> </aop:config>
et lorsque j'appelle une sauvegarde sur la session, j'ai une exception :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 opened session at timestamp: 12306501743 DEBUG [org.hibernate.jdbc.ConnectionManager] (ConnectionManager.java:415) - opening JDBC connection DEBUG [org.hibernate.transaction.JDBCTransaction] (JDBCTransaction.java:54) - begin DEBUG [org.hibernate.transaction.JDBCTransaction] (JDBCTransaction.java:59) - current autocommit status: true DEBUG [org.hibernate.transaction.JDBCTransaction] (JDBCTransaction.java:62) - disabling autocommit DEBUG [org.hibernate.impl.SessionImpl] (SessionImpl.java:220) - opened session at timestamp: 12306501743
.. ce qui provoque ..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 session = ((SessionFactory) MyBeanFactoryFromSpring.getInstance().getBean(BeanConstants.SESSION_FACTORY)).getCurrentSession(); session.save(myObject);
De plus, la transaction ouverte précédemment semble pourtant bien faire un rollback !!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 org.hibernate.HibernateException: save is not valid without active transaction at org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:297) ...
Enfin, à noter que lorsque j'utilise la méthode "manuelle" (à savoir beginTransaction et commit), cela fonctionne !!! Je n'y comprends plus rien..
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 DEBUG [org.hibernate.transaction.JDBCTransaction] (JDBCTransaction.java:152) - rollback DEBUG [org.hibernate.transaction.JDBCTransaction] (JDBCTransaction.java:193) - re-enabling autocommit DEBUG [org.hibernate.transaction.JDBCTransaction] (JDBCTransaction.java:163) - rolled back JDBC Connection DEBUG [org.hibernate.jdbc.ConnectionManager] (ConnectionManager.java:296) - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! DEBUG [org.hibernate.jdbc.ConnectionManager] (ConnectionManager.java:435) - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
Quelqu'un a une idée sur cette "double transaction" ?
Partager