Транзакция между несколькими уровнями DAO? - PullRequest
1 голос
/ 28 октября 2009

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

Я хотел откатить транзакцию, когда # 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 () 'IdentityService'.

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

В IdentityService не настроено управление транзакциями

Что я здесь не так делаю?

Ответы [ 2 ]

1 голос
/ 25 ноября 2009

Попробуйте Propagation.REQUIRED вместо Propagation.REQUIRES_NEW

0 голосов
/ 09 ноября 2009

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

...