已使用@Transactional注释的方法中的TransactionRequiredException

时间:2018-05-11 18:02:35

标签: jsf-2 cdi

public void postPessoa() {
    savePessoa();
    initializePessoa();
}

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

如果我致电postPessoa()我在TransactionRequiredException中获得了merge(),但如果我直接从JSF致电savePessoa(),那就有效了,我也不明白为什么会这样行为。

JSF:

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

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

1 个答案:

答案 0 :(得分:0)

你必须添加

@Transactional

......在班级或在postPessoa()上也是。

来自spring-doc

  

在代理模式下(是默认),仅限外部方法调用   通过代理进入是截获的。 这意味着   自调用,实际上是目标对象调用中的一个方法   目标对象的另一种方法,不会导致实际的   即使调用的方法被标记为,运行时的事务也是如此   @Transactional。此外,代理必须完全初始化以提供   预期的行为,所以你不应该依赖于你的这个功能   初始化代码,即@PostConstruct。