почему я получаю EJBTransactionRolledbackException, когда я вызываю два DAO в моей службе EJB? - PullRequest
0 голосов
/ 01 марта 2012

Я использую IBM RAD 7.5 и WebSphere 7.

У меня есть EJB (@Stateless CustomerService), и у меня есть два EJB, которые являются DAO (@Stateless CustomerDAO и @Stateless OrderDAO).

Мой метод в CustomerService работает нормально, когда я выполняю customerDAO.getAll ().

Но если я вызываю 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();
    }
  } 

Есть идеи?

Спасибо, Роб

1 Ответ

1 голос
/ 01 марта 2012

Полагаю, у вас возникла проблема с разграничением транзакций EJB. Во-первых, ваши DAO не должны быть EJB. EJB должны использоваться на уровне обслуживания, где одним из основных преимуществ является декларативное управление транзакциями. Создавая свои EJB-компоненты DAO, вы выполняете операции с управляемыми контейнерами транзакциями на уровне метода DAO.

Если вы предоставите свой даос-код и конфигурацию, мы можем сделать более точную оценку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...