Bonjour à tous !
Je travaille actuellement sur un projet en spring et je rencontre quelques difficultés vis à vis de la gestion des transactions.
Quelques éléments d'informations :
- Projet entièrement mavenisé en spring 2.5.6
- Hibernate pour la persistence des données (3.3.1.GA)
- Spring Security pour l'aspect authentification (2.0.5)
- Quartz pour les jobs schedulé
- Un peu d'AOP pour certains éléments transverses (spring-aspect 2.5.6)
Au niveau des spécificités, il faut savoir que j'utilise un filtre openSessionInView (OSIV) pour avoir accès aux propriétés lazy au niveau de mes jsp (singleSession = true, flushMode = auto).
Je pense avoir tout dit, s'il manque des renseignements, hésitez pas à me le faire savoir ^^
Venons-en aux faits ! Voici la configuration de ma couche DAO:
(La partie coupée ne contient que les accès à la base)
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 [...] <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:annotation-driven transaction-manager="txManager"/> <bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean"> <property name="properties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> <prop key="hibernate.show_sql">false</prop> <!-- Gestion du cache --> <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> <prop key="hibernate.second_level_cache">true</prop> <prop key="hibernate.use_query_cache">true</prop> <prop key="net.sf.ehcache.configurationResourceName">/conf/ehcache.xml</prop> <prop key="hibernate.generate_statistics">true</prop> <prop key="hibernate.cache.use_structured_entries">true</prop> <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop> </props> </property> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="mappingLocations"> <value>classpath*:hibernate/**/*.hbm.xml</value> </property> <property name="dataSource" ref="dataSource"></property> <property name="hibernateProperties" ref="hibernateProperties" /> </bean>
J'ai créé le service suivant:
Le dao associé est le suivant:
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 @Service("I_IndividuService") @Transactional public class IndividuService implements I_IndividuService { @Autowired private IndividuDAO individuDAO; @Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void save(final Individu individu) throws Exception { individu.setFirstname("toto"); individu.setLastname("test"); individuDAO.saveOrUpdate(individu); throw new Exception("ROLLBACK !"); } }
Lorsque j'exécute ce test, mon M. toto Test est créé dans la base de données, donc:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 @Repository public class IndividuDAO extends HibernateDaoSupport { public void saveOrUpdate(Individu ind) { getHibernateTemplate().saveOrUpdate(ind); } }
- le readOnly = true ne fonctionne pas
- le rollback ne fonctionne pas (alors que l'exception est correctement levée).
Qu'est-ce que j'ai oublié comme conf/code pour faire en sorte que M. toto Test ne vienne pas polluer ma base de données -et accessoirement pour que mes transactions fonctionnent- ?
Merci d'avance !
Partager