2009-10-28 4 views
1

Как показано ниже, я обращаюсь к методу уровня обслуживания внутри другого DAO. (Каждый DAO в системе реализован с использованием класса HibernateDAOSupport)Транзакция между несколькими слоями DAO?

Я хотел отменить транзакцию, когда # 1 или # 2 (прокомментировано в следующем коде) не удалось. Но когда # 2 выбрасывает исключение, # 1 не откатывается назад, и я могу видеть записи в базе данных.

@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); 
     } 

} 

Здесь размещена подпись для метода createPrincipal() of'IdentityService.

public void createPrincipal(Principal principal) throws DuplicateEmailException,DuplicateLoginIdException,IdentityException ; 

Там нет Управления транзакций настроены в «IdentityService»

Что я делаю неправильно здесь?

+0

метод Propagation.REQUIRES_NEW identityService.createPrincipal (...) должны создавать свою собственную транзакцией. Как его DAO настроен? –

+0

Этот DAO не настроен для транзакций (без аннотации транзакций). –

+0

Только место, где я использовал аннотацию «Транзакция», находится выше DAO. –

ответ

0

Во время звонков identityService.createPrincipal(profile.getSecurityPrincipal()); разве вы не проводите сеанс? (Выполнение запроса, например, с FlushMode.AUTO)