Как показано ниже, я обращаюсь к методу уровня обслуживания внутри другого 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»
Что я делаю неправильно здесь?
метод
Propagation.REQUIRES_NEW
identityService.createPrincipal (...) должны создавать свою собственную транзакцией. Как его DAO настроен? –Этот DAO не настроен для транзакций (без аннотации транзакций). –
Только место, где я использовал аннотацию «Транзакция», находится выше DAO. –