2016-04-27 59 views
0

我有2種方法的EJB:如果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爲從不。

我理解這一解決方法是讓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

您不需要單獨的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實例。

+0

對不起,這就是我說的另一個EJB時的意思。我會更新原來的問題。 – wsaxton

+0

那麼是的,那是你唯一的選擇。沒有辦法擁有「私有」EJB方法。 –