JEE7: Czy komponenty EJB i CDI obsługują transakcje zarządzane przez kontener?
Java EE7 składa się z kilku definicji „fasoli”:
Managed Beans 1.0 (JSR-316 / JSR-250)Dependency Injection for Java 1.0 (JSR-330)CDI 1.1 (JSR-346)JSF Managed Beans 2.2 (JSR-344)EJB 3.2 (JSR-345)Aby pozbyć się chaosu w moim umyśle, badam kilka artykułów „kiedy używać tego typu fasoli”. Jeden z plusów dlaEJB wydaje się, że tak jestsame obsługują deklaratywne transakcje zarządzane kontenerami (słynne adnotacje transakcji). Nie jestem jednak pewien, czy to prawda. Czy ktoś może to zatwierdzić?
W międzyczasie wymyśliłem prostą aplikację demo, aby sprawdzić, czy to prawda. Właśnie zdefiniowałem fasolę CDI (nie EJB - nie ma adnotacji na poziomie klasy) w następujący sposób, na podstawieto skrawek:
public class CdiBean {
@Resource
TransactionSynchronizationRegistry tsr;
@Transactional(Transactional.TxType.REQUIRED)
public boolean isTransactional() {
return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
}
}
Rezultatem GlassFish 4.0 jest to, że ta metoda faktycznie zwraca wartość true, co zgodnie z moimi pytaniami jestnie działa zgodnie z oczekiwaniami. Spodziewałem się, że kontener zignoruje adnotację @Transactional dla metody bean CDI lub nawet wyrzuci wyjątek. Używam świeżo zainstalowanego serwera GlassFish 4, więc nie ma żadnych zakłóceń.
Więc moje pytanie jest naprawdę:
Które typy fasoli faktycznie obsługują transakcje zarządzane przez kontener?W trosce o ciekawość, jak mogę przetestować go za pomocą prostej aplikacji demonstracyjnej, jeśli powyższy kod jest nieprawidłowy?(BTW: Ktoś opisał podobny problemtutaj, ale jego rozwiązanie nie dotyczy mojej sprawy.