Какая связь между 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). Если там написано что-то, что не работает, считайте (и, пожалуйста, сообщите!) Это ошибкой.