环境:
JAVA EE 7
CDI 1.2
WildFly 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()在事务中运行。此方法调用另一个私有方法innerMethod()。
2)innerMethod()使用EM.persist()调用。
问题/查询:
1)EM.persist()如何运作?
2)我试图将此与Spring框架联系起来。由于CDI使用代理(方法调用OrgBean.doSomething将通过PROXY)并且innerMethod是自调用,EM.persist()调用将如何工作,因为innerMethod()不会在事务内运行?
3)如果我错了,请纠正我。
答案 0 :(得分:3)
innerMethod()
中的代码在通过调用doSomething()
启动的事务内部运行,并在doSomething()
方法返回时结束。
doSomething()
方法称为doSomething()
方法doSomething()
做任何想做的事情,包括调用其他方法。代理人并不关心,甚至无法了解它doSomething()
方法返回代理的doSomething()方法包装器在伪代码中,代理基本上执行以下操作:
public void doSomething() {
startTransaction();
try {
orgBean.doSomething();
commitTransaction();
}
catch (RuntimeException e) {
rollbackTransaction();
throw e;
}
}
它比实际情况复杂一点,但你应该明白这一点。