2009-10-28 9 views
1

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?

+0

La méthode identityService.createPrincipal (...) doit être de créer sa propre transaction. Comment est configuré son DAO? –

+0

Ce DAO n'a été configuré pour aucune transaction (pas d'annotation transactionnelle). –

+0

Seul le lieu où j'ai utilisé l'annotation 'Transactional' est au-dessus de DAO. –

Répondre

0

Pendant les appels identityService.createPrincipal(profile.getSecurityPrincipal()); ne vidangez-vous pas la session? (Exécution d'une requête par exemple, avec FlushMode.AUTO)

1

Essayez Propagation.REQUIRED, au lieu de Propagation.REQUIRES_NEW