Java EE7 состоит из набора определений < bean:
- Управляемый Beans 1.0 (JSR-316/JSR-250)
- Injection Dependency для Java 1.0 (JSR-330)
- CDI 1.1 (JSR-346)
- Управляемый JSF Beans 2.2 (JSR-344)
- EJB 3.2 (JSR-345)
Чтобы избавиться от хаоса в моем сознании, я изучаю несколько статей "когда использовать тип bean". Один из плюсов для EJB кажется, что они одни поддерживают декларативные транзакции, управляемые контейнером (известные аннотации транзакций). Я не уверен, хотя, если это правильно. Кто-нибудь может это одобрить?
Между тем, я придумал простое демонстрационное приложение, чтобы проверить, действительно ли это так. Я просто определил CDI bean ( не 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 по методу CDI bean или даже выбросит исключение. Я использую недавно установленный сервер GlassFish 4, поэтому никаких помех нет.
Итак, мой вопрос действительно:
- Какие типы bean действительно поддерживают транзакции, управляемые контейнером?
- Просто ради любопытства, как я могу проверить его с помощью простого демонстрационного приложения, если неправильный код?
(BTW: Кто-то описал подобную проблему здесь, но ее решение не относится к моему делу.