Какая связь между BMT/CMT и EntityManager, управляемым приложением / контейнером?

Различные частичные описания предмета привели меня к подозрению, что BMT тесно связан с EntityManager, управляемым приложением (и использованием UserTransaction), и что CMT тесно связан с EntityManager, управляемым контейнером.

Может ли кто-нибудь дать (или указать мне) четкое объяснение того, как именно BMT/CMT относится к EntityManager, управляемому приложением / контейнером?

Какие комбинации допустимы между типами разграничения транзакций и типами управления EntityManager?

  • Могу ли я объединить управляемый приложением EntityManager с CMT?
  • Могу ли я объединить EntityManager, управляемый контейнером, с BMT?

Кроме того, какова связь между UserTransaction и BMT/CMT против EntityManager, управляемого приложением / контейнером?

  • Могу ли я использовать UserTransaction вместе с EntityManager, управляемым контейнером?
  • UserTransaction подразумевает BMT и наоборот?

РЕДАКТИРОВАТЬ: Согласно http://www.byteslounge.com/tutorials/container-vs-application-managed-entitymanager я могу комбинировать CMT/BMT с EntityManager, управляемыми приложением / контейнером, так, как мне нравится. Это все еще оставляет меня с вопросом о связи между UserTransaction и BMT. Одно подразумевает другое?

РЕДАКТИРОВАТЬ: вопреки ссылке, размещенной выше, http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html утверждает, что " Менеджеры сущностей, управляемых приложением, не распространяют автоматически контекст транзакции JTA. Такие приложения должны вручную получить доступ к диспетчеру транзакций JTA и добавить информацию о разграничении транзакций при выполнении операций с сущностями. Интерфейс javax.transaction.UserTransaction определяет методы для запуска, фиксации и отката транзакций. Внедрение экземпляра UserTransaction путем создания экземпляра переменная с аннотацией @Resource". Для меня это звучит так: "Менеджерам сущностей, управляемых приложениями, требуется разграничение транзакций, управляемых компонентами". Кто прав? Oracle или Byteslounge?

1 ответ

Решение

Я постараюсь ответить на ваши вопросы, но есть больше комбинаций возможных сценариев, чем вы просили, и я не буду пытаться отвечать на них. В следующем ответе под управлением контейнера я имею в виду JTA (не RESOURCE_LOCAL), EntityManager в области транзакций (внедренный с PersistenceContextType.TRANSACTION вместо PersistenceContextType.EXTENDED)

Могу ли я объединить управляемый приложением EntityManager с CMT?

Да, хотя это не обычный случай использования. По сути, созданный менеджер сущностей автоматически присоединится к текущей транзакции. Вы можете найти пример этого в спецификации JPA 2.0,

7.7.1.1 Application-managed Persistence Context used in Stateless Session Bean

Могу ли я объединить EntityManager, управляемый контейнером, с BMT?

Да, я видел неофициальные примеры и может использоваться для ТОЛЬКО контроля того, когда начинать / фиксировать / откатывать транзакцию, поскольку введенный EntityManager автоматически присоединяется к транзакции (т.е. вы не контролируете, когда entitymanager присоединяется к текущей транзакции JTA), Я не видел никаких официальных примеров (если вы делаете, пожалуйста, предоставьте их в комментариях для полноты).

Могу ли я использовать UserTransaction вместе с EntityManager, управляемым контейнером?

Вопрос не правильно поставлен: с UserTransaction вы пытаетесь контролировать транзакцию, и поэтому правильным будет вопрос о том, какая комбинация возможна: UserTransaction с CMT (что не имеет смысла, так как транзакция контролируется контейнером) или с BMT (это типичный юридический случай). И теперь вы получаете ответ на свой первоначальный вопрос с помощью диспетчера сущностей, управляемого контейнером (в зависимости от CMT или BMT).

UserTransaction подразумевает BMT и наоборот?

Я бы сказал так, потому что в CMT транзакция JTA автоматически запускается контейнером.

На ваш последний вопрос: то, что вы найдете на веб-странице Oracle, мне кажется неверным. Как я ответил на ваш первый вопрос (с официальным примером), вы можете объединить управляемый приложением объектный менеджер в CMT (без UserTransaction, пожалуйста, проверьте пример в спецификации).

Кроме того, я нашел некоторые другие путаницы в разных местах, и я думаю, что официальная документация на самом деле является спецификацией JPA (наряду с Java EE). Если там написано что-то, что не работает, считайте (и, пожалуйста, сообщите!) Это ошибкой.

Другие вопросы по тегам