我有一个带有两种方法的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必须公开曝光。
答案 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实例。