私は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();
}
}
アイデア?
おかげで、ロブ
ありがとうございました。現在、DAOはEJBであり、サービスは@EJBアノテーションを介して参照を取得します。 DAOにEJBがない場合は、EJBコード内にMyDAO dao = MyDADAを新しく行うだけでよいですか?ありがとう! –
どのようにDAOが設定されているか(たとえば、DB接続の処理方法など)、またはSpringを使用しているかどうかによって異なります。 –
こんにちは - 上記の質問にサンプルコードを追加しました。また、私は(オンラインと本で)私が持っているカップルの例を見て、どちらも@Statelesとマークされている "DAO"を持っているので、それは適切だと思いますか? –