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}"/>
答案 0 :(得分:0)
你必须添加
@Transactional
......在班级或在postPessoa()
上也是。
来自spring-doc:
在代理模式下(是默认),仅限外部方法调用 通过代理进入是截获的。 这意味着 自调用,实际上是目标对象调用中的一个方法 目标对象的另一种方法,不会导致实际的 即使调用的方法被标记为,运行时的事务也是如此 @Transactional。此外,代理必须完全初始化以提供 预期的行为,所以你不应该依赖于你的这个功能 初始化代码,即@PostConstruct。