2013-05-10 2 views
1

Я пытаюсь создать транзакционный метод, который вызывает несколько других транзакционных методов, чтобы сохранить некоторые взаимозависимые сущности db. Я хочу, чтобы транзакция полностью откатилась, если какой-либо вызов завершился неудачно. Однако это не наблюдаемое поведение. Вот мой код:вызов транзакции транзакции Hibernate в транзакционном методе отката

@Transactional(readOnly = false, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 
public void save(EntityToBeSaved entity) { 
    try{ 
      for(SubEntity sub: entity.getSubEntities()) //specifics omitted 
        saveSubEntity(sub); //this is transactional 
    } 
    catch (DataIntegrityViolationException e){ 
     throw new BusinessException("Duplicate Name"); 
    } 
} 

saveSubEntity также Propagation.REQUIRED и rollobackFor = Throwable.class, но когда сделка терпит неудачу на 2-м saveSubEntity вызова, первый subEntity является поручен.

+0

Очень удивительно. Не могли бы вы показать код 'saveSubEntity()'? Кроме того, readOnly = false и распространение = REQUIRED являются значениями по умолчанию. Вы можете удалить эти атрибуты. –

ответ

0

По-видимому, проблема возникла из-за неисправности впрыска пружины, поскольку служба не была создана при запуске, в результате чего аннотации не работали должным образом. Спасибо вам за помощь.

0

Возможно, проблема в Hibernate не может открыть транзакцию для метода save.

Предположим, что если Hibernate не создает каких-либо сделки по экономии метода, то каждый saveSubEntity вызов будет в другой транзакции из-за его Propagation.REQUIRED. В результате изменения каждого вызова saveSubEntity будут переданы базе данных.

Чтобы проверить, создается ли транзакция для сохранить метод или нет, не могли бы вы помочь мне, чтобы удалить Tranactional аннотацию на методом saveSubEnitty. Вы увидите сообщение об ошибке, если транзакция не создана для save.

+0

Здравствуйте, и спасибо вам за помощь. Я фактически разместил точку останова и оценил TransactionAspectSupport.currentTransactionStatus(), который бросил исключение NoTransactionException, поэтому, по-видимому, отец НЕ открывает транзакцию, даже несмотря на то, что она имеет распространение. ПРЕДУПРЕЖДЕНИЕ. Любая идея, почему это может быть так? –

+0

Поскольку вы используете ** основанную на аннотации Spring Transaction **, я предполагаю, что вы указали тег '' в конфигурационном файле Spring контекста приложения. Наконец, вы должны проверить тег '' и убедиться, что bean, который имеет метод ** save **, должен находиться в ** базовом пакете **. –

+0

Да, все эти параметры были правильными, проблема заключалась в явном вызове конструктора. –