Jakarta ee CDI@Transactional是否需要本地方法中的新工作

Jakarta ee CDI@Transactional是否需要本地方法中的新工作,jakarta-ee,cdi,jta,java-ee-7,Jakarta Ee,Cdi,Jta,Java Ee 7,CDI@Transactional(Transactional.TxType.REQUIRES_NEW)在同一个bean中调用时是否有效: @Transactional public void method1() { for(...) { method2(); } } @Transactional(Transactional.TxType.REQUIRES_NEW) public void method2() { ... } 我认为它不起作用,因为代理无

CDI@Transactional(Transactional.TxType.REQUIRES_NEW)在同一个bean中调用时是否有效:

@Transactional
public void method1() {
    for(...) {
        method2();
    }
}

@Transactional(Transactional.TxType.REQUIRES_NEW)
public void method2() {
   ...
}
我认为它不起作用,因为代理无法拦截本地调用。
在这种情况下,如果我想在新事务中管理method2的每个调用,那么推荐的使用模式是什么。最明显的是创建另一个bean,但这是我不喜欢的。

拦截本地方法调用对CDI不起作用,并且不能将类直接注入自身(循环依赖)。另见


自注入问题仍然存在,请参见

如果您可以将EJB用于控制器而不是CDI,那么此时您的情况会更好。EJB同样简单、更成熟,并且没有诸如不能自引用或调用本地方法之类的问题。使用EJB,您可以插入同一bean的引用,也可以使用EJB会话上下文调用本地方法。@NBW但是本地方法的问题是相同的,不是吗?解决方案是获取business接口并调用本地方法?我想知道您为什么要打开另一个事务?我没有在您的
方法1
中看到
try
/
catch
,如果其中一个
方法2
事务失败,会发生什么?围绕
method1
的事务是否仍然有效?通常事务会给您一个全有或全无的语义,通过上面的代码片段,我很难看出嵌套事务的好处。FWIW,根据SRP,您很可能仍然希望将
method2
移动到另一个bean,特别是如果它的值/用例甚至证明了一个新事务的合理性。