【发布时间】:2012-03-01 14:44:17
【问题描述】:
我正在使用 IBM RAD 7.5 和 WebSphere 7。
我有一个 EJB (@Stateless CustomerService),还有两个 EJB 是 DAO(@Stateless CustomerDAO 和 @Stateless OrderDAO)。
当我执行 customerDAO.getAll() 时,我在 CustomerService 中的方法工作正常。
但如果我调用 customerDAO.getAll() 然后 orderDAO.getByCustomerId(int id),第二个 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();
}
}
有什么想法吗?
谢谢,罗伯
【问题讨论】: