2012-03-01 10 views
0

私はEJB(@StatelessたCustomerService)を持っている、と私はDAOに(@Stateless CustomerDAOと@Stateless OrderDAO)されている2つのEJBを持つIBM RAD 7.5およびWebSphere 7.EJBサービスで2つのDAOを呼び出すと、なぜEJBTransactionRolledbackExceptionが発生しますか?

を使用しています。

私がcustomerDAO.getAll()を実行すると、CustomerServiceのメソッドが正常に動作します。

しかし、customerDAO.getAll()を呼び出してorderDAO.getByCustomerId(int id)を呼び出すと、2番目のgetAllはEJBTransactionRolledBackExceptionをスローします。

なぜこのようなことが起こりますか?

おかげで、私はこの...

@Stateless 
public class CustomerService 
    @EJB 
    private CustomerDAO customerDAO; 
    @EJB 
    private OrderDAO orderDAO; 

    public void myMethod() { 
    List<Customer> customers = customerDAO.getAll(); 
    for (Customer c : customers) { 
     List<Order> orders = orderDAO.getByCustomerId(c.getId()); 
     /*** THIS THROWS EJBTransactionRolledBackException ***/ 
    } 
    } 

を以下している...と私のDAOは次のようになり、コード

とロブ

更新...

@Stateless 
public class CustomerDAO 
    @PersistenceUnit 
    private EntityManagerFactory emf; 

    public EntityManager getEntityManager() { 
    return emf.createEntityManager(); 
    } 

    public List<Customer> getAll() { 
    try { 
     em = getEntityManager(); 
     Query query = em.createQuery(" /*...*/ "); 
     query.getResultList(); 
    } finally { 
     em.close(); 
    } 
    } 

...と...

@Stateless 
public class OrderDAO 
    @PersistenceUnit 
    private EntityManagerFactory emf; 

    public EntityManager getEntityManager() { 
    return emf.createEntityManager(); 
    } 

    public List<Customer> getByCustomerId(int customerid) { 
    try { 
     em = getEntityManager(); 
     Query query = em.createQuery(" /*...*/ "); 
     /* ... */ 
     query.getResultList(); 
    } finally { 
     em.close(); 
    } 
    } 

アイデア?

おかげで、ロブ

答えて

1

私はあなたがあなたのEJBのトランザクション境界設定に問題があると思います。まず、あなたのDAOはEJBであってはなりません。 EJBは、主要な利点の1つが宣言型トランザクション管理であるサービスレイヤーで使用する必要があります。 DAOのEJBを作成することで、DAOのメソッドレベルでコンテナ管理のトランザクション操作を行うことになります。

あなたがDAOコードと設定を提供した場合、より正確な評価を行うことができます。

+0

ありがとうございました。現在、DAOはEJBであり、サービスは@EJBアノテーションを介して参照を取得します。 DAOにEJBがない場合は、EJBコード内にMyDAO dao = MyDADAを新しく行うだけでよいですか?ありがとう! –

+0

どのようにDAOが設定されているか(たとえば、DB接続の処理方法など)、またはSpringを使用しているかどうかによって異なります。 –

+0

こんにちは - 上記の質問にサンプルコードを追加しました。また、私は(オンラインと本で)私が持っているカップルの例を見て、どちらも@Statelesとマークされている "DAO"を持っているので、それは適切だと思いますか? –

関連する問題