TransactionRequiredException в методе, который уже аннотирован @Transactional - PullRequest
0 голосов
/ 11 мая 2018
public void postPessoa() {
    savePessoa();
    initializePessoa();
}

@Transactional(rollbackOn = {Exception.class})
public void savePessoa() {
    pessoa = getEntityManager().merge(pessoa);
}

Если я звоню postPessoa(), я получаю TransactionRequiredException в merge(), но если я звоню savePessoa() напрямую из JSF, это работает, и я не понимаю, почему это поведение.

JSF:

<p:commandButton id="btnSalvar" value="Salvar" action="#{pessoasController.savePessoa}"/>

<p:commandButton id="btnSalvar" value="Salvar" action="#{pessoasController.postPessoa}"/>

1 Ответ

0 голосов
/ 11 мая 2018

Вы должны добавить

@Transactional

... на уровне класса ИЛИ на postPessoa() тоже.

из spring-doc :

В режиме прокси (, который является значением по умолчанию ), только внешние вызовы методов , поступающие через прокси, перехватываются. Это означает, что самовывоз, по сути, метод в целевом объекте, вызывающий другой метод целевого объекта, не приведет к фактической транзакции во время выполнения , даже если вызванный метод помечен @Transactional.Кроме того, прокси-сервер должен быть полностью инициализирован, чтобы обеспечить ожидаемое поведение, поэтому вам не следует полагаться на эту функцию в коде инициализации, например @ PostConstruct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...