Это академический вопрос; У меня нет сломанного кода по отношению к этому. Я просто хочу расширить свое понимание того, что происходит под капотом.
Шаблон кода, который я использовал (скопировал из книг и учебников) в моем 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 является неким синглтоном - возможно ли одновременно открывать более одной пользовательской транзакции?
Большое спасибо за обсуждение.