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?
Nie ucz się EJB, poucz się Spring Boota
@student pro: napisał prawie dobrze, ale potem się zdenerwował na moje czepianie.
W uproszczeniu:
- 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. - 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.
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?
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();