Как взаимодействуют UserTransaction и EntityManager?

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

Шаблон кода, который я использовал (скопированный из книг и учебников) в моем 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 является чем-то вроде синглтона - возможно ли иметь более одной UserTransaction открытой одновременно?

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

16
задан AlanObject 30 September 2011 в 23:23
поделиться