JEE7: EJB и CDI-бины поддерживают транзакции, управляемые контейнером?
Java EE7 состоит из нескольких определений «bean»:
Управляемые бобы 1.0 (JSR-316 / JSR-250)Внедрение зависимостей для Java 1.0 (JSR-330)CDI 1.1 (JSR-346)JSF Managed Beans 2.2 (JSR-344)EJB 3.2 (JSR-345)Чтобы избавиться от хаоса в моей голове, я изучаю несколько статей о том, «когда использовать какой тип бобов». Один из плюсов дляEJB кажется, чтоони одни поддерживают декларативные транзакции, управляемые контейнером (знаменитые аннотации транзакций). Я не уверен, хотя, если это правильно. Кто-нибудь может это одобрить?
Тем временем я придумал простое демонстрационное приложение, чтобы проверить, правда ли это. Я только что определил бин CDI (не EJB - он не имеет аннотаций на уровне класса) следующим образом, основанный наэто фрагмент кода:
public class CdiBean {
@Resource
TransactionSynchronizationRegistry tsr;
@Transactional(Transactional.TxType.REQUIRED)
public boolean isTransactional() {
return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
}
}
Теперь результат на GlassFish 4.0 заключается в том, что этот метод на самом деле возвращает true, что, по моим запросам,не работает, как ожидалось, Я ожидал, что контейнер проигнорирует аннотацию @Transactional для метода bean-компонента CDI или даже выдаст исключение. Я использую только что установленный сервер GlassFish 4, поэтому никаких помех нет.
Итак, мой вопрос действительно:
Какие типы бинов действительно поддерживают транзакции, управляемые контейнером?Ради любопытства, как я могу протестировать его с помощью простого демонстрационного приложения, если приведенный выше код неверен?(Кстати: кто-то описал похожую проблемуВот, но его решение не относится к моему делу.