如果EJB方法忽略其他方法的事务属性,我如何对EJB事务进行微观管理?

时间:2016-04-27 15:18:17

标签: jpa transactions ejb

我有一个带有两种方法的EJB:

@Stateless
public FooFacade implements FooFacadeRemote {

    ...

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)
    public void saveFoos(List<Foo> foos) {
        for(Foo foo: foos) {
            saveFoo(foo);
        }
    }

    @TransactionAttribute(javax.ejb.TransactionAttributeType.REQUIRED)
    private void saveFoo(Foo foo) {
        em.persist(foo);
    }
}

我刚刚发现调用自己的方法的EJB忽略了这些方法的TransactionAttributeType。所以我得到了事务所需的异常,因为 saveFoo “看到”TransactionAttributeType为NEVER。

我知道解决方法是让另一个EJB实例执行任务:

@EJB(name = "FooFacade")
private FooFacadeRemote self;

@TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)
public void saveFoos(List<Foo> foos) {
    for(Foo foo: foos) {
        self.saveFoo(foo);
    }
}

但这真的需要吗?我的意思是,我不希望saveFoo必须公开曝光。

1 个答案:

答案 0 :(得分:1)

您不需要单独的EJB,只需通过EJB代理调用该方法即可。如果这是一个无状态或单例会话bean,则只是对同一EJB的EJB引用:

@Stateless
public class MyEJB implements MyEJBInterface {
    @EJB MyEJBInterface self;
    ...

    @TransactionAttribute(javax.ejb.TransactionAttributeType.NEVER)
    public void saveFoos(List<Foo> foos) {
        for (Foo foo: foos) {
            self.saveFoo(foo);
        }
    }
}

如果这是一个有状态会话bean,则注入@Resource SessionContext,并使用getBusinessInterface将EJB代理获取到同一个有状态会话bean实例。

相关问题