当我在EJB服务中调用两个DAO时,为什么会出现EJBTransactionRolledbackException?

时间:2012-03-01 14:44:17

标签: java ejb

我正在使用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

1 个答案:

答案 0 :(得分:1)

我猜你的EJB事务划分存在问题。首先,您的DAO不应该是EJB。 EJB应该在服务层使用,其中一个主要优点是声明式事务管理。通过制作DAO EJB,您可以在DAO方法级别上使用容器管理的事务操作。

如果您提供dao代码和配置,我们可以进行更明确的评估。