EJB JPA транзакции - PullRequest
       17

EJB JPA транзакции

2 голосов
/ 17 января 2012

Я использую JSF 2.1, EJB 3.1, JPA 2.0, Glassfish 3.1.1 и NetBeans 7.0.1.

Для каждого класса сущностей я создал отдельный класс Facade, например, UserFacade и AddressFacade, используя инструменты NetBeans. Эти два объекта не связаны друг с другом и полностью независимы друг от друга. Тем не менее, мне нужно поместить их в базу данных во время одной транзакции, и если одна из них не может быть вставлена, то другая также должна быть откатана. Как я могу это сделать? Насколько я знаю, EJB-контейнер сам управляет транзакциями и не позволяет вручную контролировать границы транзакций.

Ответы [ 3 ]

3 голосов
/ 17 января 2012

Транзакция будет откатывать все, пока вы «касаетесь» обеих ваших сущностей одним и тем же сохранением, обновлением или удалением, однако вы говорите, что они в любом случае не связаны друг с другом, и поэтому я предполагаю, что у вас есть выполнить 2 сохраняется, и это не будет в той же области транзакции.

Вариант 1

Вы можете сделать что-то легкое и уродливое для этого, в JPA есть @PrePersist и @PreUpdate, чтобы вы могли убедиться, что все с предыдущим сохранится. Это создаст плохую кодовую базу и вызовет нежелательные зависимости.

Вариант 2

Вы можете просто иметь связь между пользователем и адресом, что является естественным.

Вариант 3

Третий вариант - использовать Управляемая компонентом транзакция

2 голосов
/ 17 января 2012

Можно контролировать транзакции самостоятельно.Эта функция называется Управляемые компонентом транзакции (BMT).Вы можете прочитать больше о них здесь .

Также вам нужно понять вещь TransactionManagement.Oracle описывает это в этой статье .

Пример:

@Stateless
@TransactionManagement(TransactionManagementType.BEAN)
public class MyEJB implements MyEJBLocal {

  @Resource
  private EJBContext context;

  @PersistenceContext
  private EntityManager em;

  public void doMyAction() {
    UserTransaction transaction = context.getUserTransaction();
    transaction.begin();

    ... create myEntity ...

    em.persist(myEntity);
    transaction.commit();
  }

}
2 голосов
/ 17 января 2012

В самом базовом случае каждый открытый метод EJB-компонента выполняется в одной транзакции, которая откатывается при возникновении исключения внутри метода.

Таким образом, если вы создадите обе сущности в одном и том же методе, творения будут заключены в одну транзакцию.

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