Comme indiqué ci-dessous, j'accède à une méthode de couche Service à l'intérieur d'un autre DAO. (Chaque DAO du système est implémenté à l'aide de la classe HibernateDAOSupport)Transaction entre plusieurs couches DAO?
Je souhaitais annuler la transaction lorsque # 1 ou # 2 (commentée dans le code suivant) échouait. Mais lorsque # 2 déclenche une exception, # 1 n'est pas annulé et je peux voir les entrées dans la base de données.
@Transactional(readOnly=false, rollbackFor={DuplicateEmailException.class,DuplicateLoginIdException.class,IdentityException.class},propagation=Propagation.REQUIRES_NEW)
public void createUserProfile(UserProfile profile)
throws DuplicateEmailException, DuplicateLoginIdException,
IdentityException {
// #1 create principal using Identity Service
identityService.createPrincipal(profile.getSecurityPrincipal());
try {
// #2 save user profile using Hibernate Template
getHibernateTemplate().save(profile);
} catch (RuntimeException e) {
throw new IdentityException("UseProfile create Error", e);
}
}
Voici la signature pour la méthode createPrincipal() of'IdentityService.
public void createPrincipal(Principal principal) throws DuplicateEmailException,DuplicateLoginIdException,IdentityException ;
Il n'y a pas de gestion de transaction configurée dans 'IdentityService'
Ce que je fais mal ici?
La méthode identityService.createPrincipal (...) doit être de créer sa propre transaction. Comment est configuré son DAO? –
Ce DAO n'a été configuré pour aucune transaction (pas d'annotation transactionnelle). –
Seul le lieu où j'ai utilisé l'annotation 'Transactional' est au-dessus de DAO. –