Bonjour,

J'utilise SPRING2.5.5 + Hibernate3.3 +JPA1.0
Je gère mes transactions par annotation @Transactional

Ma couche service, qui gère les transactions, est censée retourner une exception de type ServiceException

Ce qui donne pour un service :
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
 
 @Transactional(rollbackFor = ServiceException.class)
    public Integer monService(DTO dto) throws ServiceException{
    		try {
			// execution du service
			...
 
		} catch (ServiceException e) {
                        ....
			throw e;
		}
		} catch (Exception e) {
                        ...
			throw new ServiceException(e);
		}
}
Tel quel, si j'ai une erreur en BD, il y a des chances que le problème ne soit détecté que au commit(un flush étant fait à ce moment là), trop tard pour mon try catch. J'ai donc ajouté un EntityManager.flush() pour forcer l'écriture en BD et détecter un maximum de soucis le plus tôt possible.

Mes problèmes sont :
  • Si j'ai une exception au commit (non détécté au em.flush() que j'ai ajouté), ma couche cliente va se prendre une PersistenceException
  • Quand j'ai une ServiceException , le rollback est fait (normal). Si j'ai une erreur au rollback (ce qui est parfois mon cas sur une base DB2), de la même faaçon la couche cliente se prendre une java.sql.SQLException ou je ne sais quoi


Quelle est la façon propre de traiter les exceptions quand on utilise ce mode par annotations, à part surcharger le @Transactional(oui ça m'a traversé l'esprit).

Merci pour votre éclairage