@ManagedBean и @Transactional - ошибка весной? Обходные? - PullRequest
0 голосов
/ 15 января 2012

У меня в Webapp был следующий компонент поддержки JSF

@ManagedBean
class MyBackingBean implements Serializable {

    private MyHibernateRepository repository;
    ...

    @Transactional 
    public void save() {
        ....
        repository.save(myObject);
    }

}

Когда доходит до вызова метода repository.save - я получаю следующую ошибку

no transaction is in progress

У меня естьполучил два вопроса

  1. Это из-за ошибки как это ?
  2. Я считаю, что есть два обходных пути - есть ли другие?

2.1 Первый обходной путь - использование

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
  protected void doInTransactionWithoutResult(TransactionStatus status) {
    repository.save(myObject);
  }
});

2.2 Второй обходной путь

Создайте вспомогательный класс и аннотируйте его.

2.3 (Возможный третий обходной путь - аннотировать @Transactional для метода внутреннего класса. Это очень похоже на 2.2).

1 Ответ

2 голосов
/ 07 мая 2012

При использовании аннотаций Spring (я знаю, что @Transactional является стандартом Sun - но вам нужна реализация) - Spring использует AOP для аннотирования класса для добавления кода обработки транзакций. Это работает только для бобов Spring. Если ваш класс является вспомогательным компонентом для JSF - платформа Mojarra не будет вставлять свой собственный код обработки транзакций в эту аннотацию.

Краткий ответ - @Transactional работает для бобов, загружаемых Spring. В противном случае вам нужно найти фреймворк, который его поддерживает, или предположить, что он не будет работать.

...