JEE7: czy EJB i CDI Beans obsługują transakcje zarządzane kontenerami?

Java EE7 składa się z kilku definicji "fasolowych":

  • 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, studiuję kilka artykułów "Kiedy użyć jakiego typu fasoli". Jedną z zalet EJB wydaje się być to, że tylko one wspierają deklaratywne kontenery zarządzane transactions (słynne adnotacje dotyczące transakcji). Nie jestem pewien, czy to prawda. Czy ktoś może to zatwierdzić?

Tymczasem wymyśliłem prostą aplikację demonstracyjną, aby sprawdzić, czy to prawda. Właśnie zdefiniowałem CDI bean (Nie EJB - nie ma adnotacji na poziomie klasy) w następujący sposób, na podstawie tego fragmentu:

public class CdiBean {
    @Resource
    TransactionSynchronizationRegistry tsr;

    @Transactional(Transactional.TxType.REQUIRED)
    public boolean isTransactional() {
        return tsr.getTransactionStatus() == Status.STATUS_ACTIVE;
    }
}

Wynik na GlassFish 4.0 jest taki, że ta metoda zwraca true, co według moich zapytań, na nie działa zgodnie z oczekiwaniami. Spodziewałem się, że kontener zignoruje adnotację @ Transactional w metodzie CDI bean, a 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 obsługują transakcje zarządzane kontenerami?
  • tak z ciekawości, jak mógłbym przetestować go za pomocą prostej aplikacji demo, jeśli powyższy kod jest źle?

(BTW: ktoś opisał podobny problem tutaj, ale jego rozwiązanie nie dotyczy mojego przypadku.

Author: Community, 2013-07-24

2 answers

Do Java EE 7 tylko EJB był transakcyjny, a adnotacja @Transactional nie istniała.

Od Java EE 7 i JTA 1.2 Można używać transactional interceptor w CDI z adnotacją @Transactional.

Aby odpowiedzieć na pytanie o najlepszy rodzaj fasoli, odpowiedź jest domyślnie CDI.

CDI beans są lżejsze od EJB i obsługują wiele funkcji (w tym bycie EJB) i są domyślnie aktywowane (po dodaniu pliku beans.xml do aplikacji). Ponieważ Java EE 6 @Inject zastępuje @EJB. Nawet jeśli używasz zdalnego EJB (funkcja nie istnieje w CDI), najlepsza praktyka sugeruje, aby @EJB raz wstrzyknąć zdalny EJB i producenta CDI, aby odsłonić go jako CDI bean

public class Resources {

    @EJB
    @Produces
    MyRemoteEJB ejb;

}

To samo jest sugerowane dla zasobów Java EE

public class Resources2 {

    @PersistenceContext
    @Produces
    EntityManager em;

}

Ci producenci będą później używane

public class MyBean {

    @Inject
    MyRemoteEJB bean;

    @Inject
    EntityManager em;

}

EJB nadal ma sens dla niektórych usług, takich jak JMS lub asynchroniczne leczenie, ale będziesz ich używać jako CDI bean.

 31
Author: Antoine Sabot-Durand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 21:10:16

The javadoc of Transactional says:

Javax.transakcja.Adnotacja transakcyjna zapewnia aplikacji możliwość deklaratywnej kontroli granic transakcji na CDI managed beans, a także klas zdefiniowanych jako managed beans przez specyfikację Java EE, zarówno na poziomie klasy, jak i metody, gdzie adnotacje na poziomie metody zastępują te na poziomie klasy.

Więc twoje założenia są błędne. EJB, aż do Java EE 6, były jedynymi rodzajami komponenty wspierające transakcje deklaratywne. Adnotacja transakcyjna została dokładnie wprowadzona w Java EE 7, aby uczynić transakcyjną nie-EJB, zarządzaną CDI beans.

 7
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-24 17:25:10