Witam,
coś nie mogę dojść do ładu z transakcjami
przyjąłem taką strykturę - dao < ejb < servlet
w dao mam @PersistenceContext, logika pracy z różnymi dao jest w EJB, a z EJB pracuję w servletach
jak to obadnotacjować (gdzie), żeby transakcjami zarządzał container lub bean?
Każdy bean EJB domyślnie jest zarządzany przez kontener. Jeśli chcesz zarządzać ręcznie transakcjami (bo np. w ramach metody potrzebujesz kilku transakcji, to w zasadzie jedyny powód dla BMT) to możesz włączyć BeanManagedTransactions. Potem korzystasz z UserTransaction.
Adnotacje:
@Stateless
@LocalBean
@TransactionManagement(TransactionManagementType.BEAN)
public class MyEjb {
}
Mniej więcej coś takiego widać na stronie: http://examples.javacodegeeks.com/enterprise-java/ejb3/transactions/bean-managed-transactions/
Ok, to się zgadza, ale : )
w tym przykładzie mamy TransactionManagementType w tej samej klasie co @PersistenceContext i UserTransaction
a ja potrzebowałbym to regulować w inny sposób tzn. efekt miałby być taki
@PersistenceContext w MyDao, @TransactionManagement w MyEjb, a @Resource UserTransaction w MyServlet (jesli BMT)
To chyba mocno nietypowe wymaganie. W JEE zdaje się warstwą transakcyjną powinno zarządzać EJB, a servlet to tylko wejście - wyjście. Może transakcje CDI się na coś przydadzą,
tam można ręcznie zarządzać transakcjami od JEE 7, trochę jak w Springu. Problem w tym, że mało kto me JEE 7 na produkcji. :( Beanem CDI może być każdy obiekt, wystarczy ustawić all w beans.xml.
Tak właściwie, to dlaczego servlet miałby zarządzać transakcjami?
to niech se wsadzi do servleta EntityManager i odpali entityManager.getTransaction().begin();
tak miałem w warach na tomcacie, teraz kombinuję
EJB jako servlet (rest)? but how?
//
dlaczego servlet?
bo albo mam jedną transakcję na request (chyba zrobię EJB jako dao), albo mogę ręcznie ją podzielić na dwie lub więcej