Java EE transakcje

0

Uczę się ostatnio Javy EE i mam zagwozdkę z transakcjami. Chodzi mi konkretnie jakie ejb itp mają automatyczne tworzenie transakcji (nie trzeba samemu deklarować).
Poprawcie mnie jeśli się mylę, kontener tworzy automatycznie transakcje dla: Message driven bean, metod @Schedule, @Timout co jeszcze?

1

Nie ucz się EJB, poucz się Spring Boota

1

@student pro: napisał prawie dobrze, ale potem się zdenerwował na moje czepianie.

W uproszczeniu:

  1. Metody biznesowe ejb są domyślnie oznaczone jako @Transaction(Reuired) czyli jak jeszcze nie ma w danym ciągu wywołań transakcji to się otworzy na wejściu, a na wyjściu metody zamknie.
    A jak już jest aktywna transakcja (w metodzie wywołującej), to metoda będzie wykonana w jej ramach.
  2. Metody biznesowe to te, które należą do interfejsu EJB - lub po prostu wszystkie publiczne (jesli takiego interfejsu nie masz).

Ale do tego dochodzi, mnóstwo niuansów/ tricków i wyjątków - które mogą spowodować, że g... nie transakcje będziesz miał.
Tak, że część ostatecznej opini przedpiścy jest słuszna : NIe ucz się EJB.

W którymś momencie odkryjesz, że w użyciu są 4 specyfikacje JavaEE (5 6 7 i 8), któree się między sobą różnią. Co więcej są używane w połączeniu
z CDI w różych wersjach, gdzie akurat tranakcje na beanach działają (lub nie) różnie , w zależności od wersji. Bagno, bagno, bagno.

Druga cęść już mniej. bo Spring boot to taka sama kupa. Tylko w innym opakowaniu. Springi mają prostszy zestaw reguł, ale pozwalają na jeszcze większe zepsucie sobie kodu.

0

Ok, dzięki za odpowiedź. Drugie pytanie które mnie nurtuje to czy można tworzyć transakcje zwykłych beanach? np przy pomocy UserTransaction? Czy transakcje są tylko przeznaczone dla EJB?

0

Jakoś tak:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("persistenceUnitName");
EntityManager em = emf.createEntityManager();

InitialContext ctx = new InitialContext();
UserTransaction utx = (UserTransaction) ctx.lookup("java:comp/UserTransaction");
utx.begin();
em.joinTransaction(); //EntityManager musi być skojarzony z transakcją
// Persist the new employee
em.persist(newEmp);
// End the transaction
utx.commit();

1 użytkowników online, w tym zalogowanych: 0, gości: 1