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:

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>
(La partie coupée ne contient que les accès à la base)

J'ai créé le service 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 !");
	}
}
Le dao associé est le suivant:

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);
	}
}
Lorsque j'exécute ce test, mon M. toto Test est créé dans la base de données, donc:
- 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 !