Это академический вопрос; у меня нет никакого сломанного кода в связи с этим. Я просто хочу расширить свое понимание того, что происходит под капотом.
Шаблон кода, который я использовал (скопированный из книг и учебников) в моем 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
Итак, мои вопросы следующие:
Почему экземпляр EntityManager и экземпляр UserTransaction инжектируются с аннотациями из двух, казалось бы, не связанных пакетов?
Почему используется аннотация @Resource и @PersistenceContext, а не @ManagedProperty или, возможно, @Inject?
Как метод persist() получает доступ и взаимодействует с объектом utx? Если я забываю вызов utx.begin(), менеджер сущностей знает об этом и выбрасывает исключение. Должно быть, он находит объект UserTransaction каким-то магическим способом. Не лучше ли было бы определить интерфейс следующим образом: em.persist(utx, entity)?
Если utx является чем-то вроде синглтона - возможно ли иметь более одной UserTransaction открытой одновременно?
Большое спасибо за любое обсуждение.