gpt4 book ai didi

java - CDI @Transactional 与自调用

转载 作者:行者123 更新时间:2023-11-29 04:54:25 27 4
gpt4 key购买 nike

环境:

Java EE 7

CDI 1.2

野蝇 8.2.0

代码:

我有一个具有以下方法的 JAVA 类。

@SessionScoped
@Named("orgBean")
public class OrgBean{

@Transactional
public void doSomething(){

//EM.persist();
//call private method
innerMethod();

}

private void innerMethod(){


EM.persist(); //why is this working ?

}

}

1)doSomething() 方法在一个事务中运行。此方法调用另一个私有(private)方法 innerMethod()。

2)innerMethod() 使用 EM.persist() 调用。

问题/查询:

1)EM.persist() 是如何工作的?

2) 我试图将此与 Spring 框架联系起来。由于 CDI 使用代理(方法调用 OrgBean.doSomething 将通过代理)并且 innerMethod 是自调用,EM.persist() 调用将如何工作,因为 innerMethod() 不会在事务内运行?

3)如有错误请指正

最佳答案

innerMethod() 中的代码在调用 doSomething() 开始的事务中运行,并在调用 doSomething() 时结束方法返回。

  1. 事务代理的 doSomething() 方法被调用
  2. 代理开始交易
  3. 代理调用 OrgBean 的实际 doSomething() 方法
  4. OrgBeans 的doSomething() 做任何它想做的事,包括调用其他方法。代理不关心,甚至不知道
  5. OrgBeans 的 doSomething() 方法返回到代理的 doSomething() 方法包装器
  6. 事务代理提交事务。

在伪代码中,代理基本上做了以下事情:

public void doSomething() {
startTransaction();
try {
orgBean.doSomething();
commitTransaction();
}
catch (RuntimeException e) {
rollbackTransaction();
throw e;
}
}

这比实际情况要复杂一些,但您应该明白了。

关于java - CDI @Transactional 与自调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34303716/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com