Witam,
proszę o wyjaśnienie różnic między typam transakcji JTA i RESOURCE_LOCAL.
Według moich informacji wynika, że używając transakcji typu JTA źródło danych musimy skonfigurować na serwerze aplikacyjnym. W pliku persistence.xml podajemy tylko nazwę tego źródła:
<persistence-unit name="zrodlo" transaction-type="JTA">
<jta-data-source>zrodlo</jta-data-source>
</persistence-unit>
W aplikacji możemy wtedy użyć adnotacji @PersistenceContext aby dostać obiekt managera encji (EntityManager)
Wykorzystując komponenty sesyjne EJB i transakcje JTA nie musimy się martwić o zarządzanie transakcjami, gdyż wszystkie metody komponentu sesyjnego wykonywane są w ramach transakcji. Kiedy w takim razie transakcje są wycofywane?
Przykładowy kod mógłby wyglądać tak:
@Stateless
public class MojBean implements MojLocal {
@PersistenceContext(unitName = "zrodlo")
EntityManager em;
public void zmien(int id) {
EncjaJPA encja= em.find(EncjaJPA.class, id);
encja.setNazwa("Nowa nazwa");
em.merge(encja);
}
}
Jeżeli nie kożystamy z EJB musimy samodzielnie zarządzać transakcjami JTA używając do tego interfejsu UserTransaction:
@Resource
private UserTransaction ut
@PersistenceContext(unitName = "zrodlo")
EntityManager em;
//...
ut.begin();
em.jainTransaction();
boolean comitted = false;
try{
//operacje na obiekcje em
ut.commit();
commited = true;
} finally{
if(!comitted)
ut.rollback();
}
Z kolei jeżeli wykożystujemy transakcje typu RESOURCE_LOCAL źrodło danych możemy skonfigurować na serwerze aplikacyjnym lub bezpośrednio w pliku persistence.xml
W pierwszym przypadku w pliku persistence.xml podajemy tylko nazwę źródła danych np:
<non-jta-data-source>zrodlo</non-jta-data-source>
W kodzie aplikacji aby uzyskać obiekt EntityManagera musimy użyć obiektu EntityManagerFactory, z tego powodu nie możemy użyc adnotacji @PersistenceContext. W celu uzyskania obiektu EntityManagerFactory możemy za to użyć adnotacji @PersistenceUnit.
W drugim przypadku wszystkie dane do połączenia z bazą danych konfigurujemy wewnątrz znacznika <properties> </properties>, ale nie możemy używać żadnych adnotacji w celu uzyskania obiektów EntityManager lub EntityManagerFactory. Dostęp do obiektu EntityManagerFactory możemy uzyskać w następujący sposób
Persistence.createEntityManagerFactory("zrodlo");
W trybie RESOURCE_LOCAL samodzielnie musimy zarządzać transakcjami nawet jeżeli korzystamy z EJB? Robimy to nie poprzez interfejs UserTransaction tylko EntityTransaction, który otrzymujemy poprzez wywołanie metody getTransaction(); na managerze encji np:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("zrodlo");
EntityManager em = createEntityManager();
em.getTransaction().begin();
EncjaJPA encja= em.find(EncjaJPA.class, 1);
encja.setNazwa("Nowa nazwa");
em.merge(encja);
em.getTransaction().commit();
em.close();
Proszę o potwierdzenie, bądź zaprzeczenie tych informacji i ewentualnie podanie dodatkowych informacji o których powinienem wiedzieć.
Pozdrawiam