Как взаимодействует UserTransaction и EntityManager? - PullRequest
16 голосов
/ 01 октября 2011

Это академический вопрос; У меня нет сломанного кода по отношению к этому. Я просто хочу расширить свое понимание того, что происходит под капотом.

Шаблон кода, который я использовал (скопировал из книг и учебников) в моем JPA DAO для моих типичных веб-приложений JSF, в основном таков:

public class someDAO {

    @PersistenceContext protected EntityManager   em;
    @Resource           private   UserTransaction utx;    

    public void persist(Entity entity) {
        try {
            utx.begin();
            em.persist(entity);
            utx.commit();
        } catch ( // gawd awful long list of possible exceptions ) 

        // etc

Итак, мои вопросы таковы:

  1. Почему экземпляр EntityManager и экземпляр UserTransaction вводятся с аннотациями из двух, казалось бы, не связанных пакетов?

  2. Почему используется аннотация @Resource и @PersistenceContext, а не @ManagedProperty или, возможно, @Inject?

  3. Как метод persist () получает доступ и взаимодействует с объектом utx ? Если я забуду вызов utx.begin () , менеджер сущностей узнает об этом и выдаст исключение. Он должен найти объект UserTransaction каким-то волшебным способом. Разве не было бы лучше, чтобы архитектура определяла интерфейс как: em.persist (utx, entity) ?

  4. Если utx является неким синглтоном - возможно ли одновременно открывать более одной пользовательской транзакции?

Большое спасибо за обсуждение.

1 Ответ

13 голосов
/ 01 октября 2011
  1. Поскольку UserTransaction является частью Java Transaction API (JTA), а EntityManager является частью Java Persistence API (JPA). JTA не является частью JPA. JPA использует услуги, предоставляемые JTA.

  2. Not ManagedProperty - это некоторая аннотация, которая действует только в классах, аннотированных @ManagedBean. Возможно, было сочтено лучше не вводить UserTransaction иначе в управляемых бобах.

  3. Поиск JNDI для активной транзакции. Зарезервированное имя выглядит как java: comp / UserTransaction. Одна реализация: http://www.java2s.com/Open-Source/Java-Document/Database-ORM/hibernate/org/hibernate/transaction/JTATransactionFactory.java.htm

  4. Это не какой-то синглтон, вы можете иметь более одного. Но только один поток может быть активным.

...