CDI @Transactional与自我调用

时间:2015-12-16 04:01:54

标签: java cdi wildfly-8 transactional

环境:

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)如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:3)

innerMethod()中的代码在通过调用doSomething()启动的事务内部运行,并在doSomething()方法返回时结束。

  1. 交易代理的doSomething()方法称为
  2. 代理启动交易
  3. 代理调用OrgBean的实际doSomething()方法
  4. OrgBeans的doSomething()做任何想做的事情,包括调用其他方法。代理人并不关心,甚至无法了解它
  5. OrgBeans的doSomething()方法返回代理的doSomething()方法包装器
  6. 事务代理提交事务。
  7. 在伪代码中,代理基本上执行以下操作:

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

    它比实际情况复杂一点,但你应该明白这一点。