2016-04-27 5 views
0

私は2つの方法でEJB持っている:私はちょうど、独自のメソッドを呼び出すEJBは、これらのメソッドのTransactionAttributeTypeを無視することを発見し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); 
    } 
} 

を。だから、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

別個の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を注入し、同じステートフルにEJBのプロキシを取得するためにgetBusinessInterfaceを使用セッションBeanのインスタンス

+0

申し訳ありませんが、それは私が別のEJBを言いたときの意味です。元の質問を更新します。 – wsaxton

+0

はい、あなたの唯一の選択肢です。 "プライベート" EJBメソッドを持つ方法はありません。 –

関連する問題