2016-01-18 2 views
0

Мы используем Spring 4.x и Spring Data JPA с декларативным управлением транзакциями, у меня есть контроллер, служба и репозиторий, например, под псевдокодом.Весеннее декларативное управление транзакциями и обработка отката

@Service 
@Transactional(readOnly=true) 
public class SampleService { 

    @Autowired 
    private SampleRepository sampleRepository; 

    @Transactional 
    public MyEntity saveMyEntity(MyEntity entity) { 
     //do some business logic 
     return sampleRepository.save(entity); 
    } 
} 

public class SampleController { 

    @Autowired 
    private SampleService sampleService; 

    public String saveSample(@Valid MyEntity entity) { 
     //Validation 
     //If Valid 
     sampleService.saveMyEntity(entity); 
     //After saving do some view related rendering logic 
     //Assume here view related rendering logic throws Exception 
     return "view" 
    } 
} 

В приведенном выше коде ошибка выкинут после вызова sampleService.saveMyEntity (лица);, но транзакция не отмечена для отката, поэтому конечный пользователь получит страницу с ошибкой, но за объектом сцены сохраняется.

Есть ли способ отменить транзакцию?

+0

Возможно, этот может вам помочь: http://stackoverflow.com/questions/16167278/spring-transaction-doesnt-rollback – Teo

+0

@Teo спасибо, но не совсем такая же проблема, здесь метод sampleService.saveMyEntity возвращается без каких-либо исключений , Здесь исключение происходит после этого вызова службы и внутри моего контроллера. – Nick

+1

Сделка совершается после завершения сохранения saveMyEntity(). После этого нельзя откат. Вам нужно будет расширить сферу транзакции, чтобы включить дополнительную логику. –

ответ

1

Вы можете сделать следующее.

@Transactional(rollbackFor=Exception.class) 
public String saveSample(@Valid MyEntity entity) { 
    //Validation 
    //If Valid 
    sampleService.saveMyEntity(entity); 
    //After saving do some view related rendering logic 
    //Assume here view related rendering logic throws Exception 
    return "view" 
} 

Поскольку для развертывания транзакций по умолчанию не требуется новое. Транзакция начнется с SampleController.saveSample(), и тот же будет использоваться SampleService.saveMyEntity(). Когда исключение выбрано из saveSample(), вся транзакция будет отменена.

+0

его правда, если я расширяю область транзакций до контроллера, он будет работать, но я думаю, что это не очень хорошая практика для добавления транзакции на уровне контроллера. – Nick

Смежные вопросы