我正在使用IBM RAD 7.5和WebSphere 7。
我有一个EJB(@Stateless CustomerService),我有两个DAO(@Stateless CustomerDAO和@Stateless OrderDAO)。
当我做customerDAO.getAll()时,我在CustomerService中的方法工作正常。
但是如果我调用customerDAO.getAll()然后调用orderDAO.getByCustomerId(int id),则第二个getAll会抛出EJBTransactionRolledBackException。
为什么会发生这种情况,以及如何预防?
谢谢,Rob
我有以下内容......
@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();
}
}
有什么想法吗?
谢谢,Rob
答案 0 :(得分:1)
我猜你的EJB事务划分存在问题。首先,您的DAO不应该是EJB。 EJB应该在服务层使用,其中一个主要优点是声明式事务管理。通过制作DAO EJB,您可以在DAO方法级别上使用容器管理的事务操作。
如果您提供dao代码和配置,我们可以进行更明确的评估。