2011-12-08 6 views
18

Mam obecnie problem ze zrozumieniem koncepcji JPA.Zarządzanie aplikacjami a kontenerami Zarządzanie podmiotami

Obecnie używam/rozwijam najnowszą bazę danych EclipseLink, Glassfish, Derby, aby zademonstrować projekt.

Zanim opracuję coś znacznie większego, muszę mieć całkowitą pewność, jak działa ta PersistingUnit w zakresie różnych zakresów.

Mam kilka serwletów 3.0 i obecnie zapisuję klasy obiektów powiązanych użytkownika w obiekcie request.session (wszystko w tym samym pliku wojny). Obecnie używam zarządzanego przez aplikację EntityManager przy użyciu wtrysku EntityManagerFactory i UserTransaction. Działa gładko, gdy jest testowany przeze mnie. Różne wersje jednostek występują, gdy 2 osoby uzyskują dostęp do tych samych podmiotów w tym samym czasie. Chcę pracować z zarządzanymi ziarnami przechodzącymi przez tę samą WAR, tę samą jednostkę utrwalania, jeśli to możliwe.

Przeczytałem http://docs.oracle.com/javaee/6/tutorial/doc/bnbqw.html i kilka wyjaśnień tych zakresów, które nie mają dla mnie żadnego sensu.

Krótka historia krótka, jakie są różnice między aplikacjami i menedżerami EntityManager zarządzanymi przez aplikację i kontenerem?

Odpowiedz

17

Kiedy mówisz o zarządzanej przez aplikację transakcji, oznacza to twój kod, który ma obsługiwać transakcję. W skrócie oznacza to, że:

zadzwonić:

entityManager.getTransaction().begin(); //to start a transaction 

wtedy, jeśli sukces będzie zapewnienie, aby zadzwonić

entityManager.getTranasaction().commit(); //to commit changes to database 

lub w przypadku awarii można upewnić zadzwonić:

entityManager.getTransaction().rollBack(); 

Teraz wyobraź sobie, że masz pojemnik, który wie, kiedy zadzwonić pod numer begin(), commit() lub rollback(), to jest transakcja zarządzana kontenerem. Ktoś dbający o transakcję w twoim imieniu.

Trzeba tylko to określić.

+0

co masz na myśli przez "Teraz wyobraź sobie, że masz kontener, który wie, kiedy nazwać bycie, zatwierdzenie lub wycofanie, jest to transakcja zarządzana przez kontener, ktoś, kto zajmuje się transakcją w twoim imieniu."? –

+0

Kontener jest jak wiosna, gdzie konfigurujesz swój komponent, określasz, jaki jest twój obiekt tansakcyjny, tak jak konfigurujesz komponent bean, określasz, że Twój komponent bean jako @Transactional, a twoja transakcja jest zajęta przez wiosnę – mprabhat

+3

Znalazłem pytanie, które odzwierciedla co Szukałem - "użytkowania i różnicy aplikacji EntityManagers zarządzanych przez aplikację i kontenerem", aby dowiedzieć się, że zaakceptowana odpowiedź mówi o czymś innym - kontener kontra aplikacja obsługiwana _transactions_. Ponadto odpowiedź zaczyna się od "Kiedy mówisz o transakcji zarządzanej przez aplikację", której OP nie powiedział. – alterfox

11

Kontenerowa transakcja (CMT) może być uznana za rodzaj deklaratywnej transakcji, w którym to przypadku zarządzanie transakcjami jest delegowane do kontenera (zwykle kontener EJB), a wiele prac rozwojowych można uprościć.

Jeśli jesteśmy w środowisku Java EE z kontenerem EJB, możemy bezpośrednio użyć CMT.

Jeśli jesteśmy w środowisku Java SE lub środowisku Java EE bez kontenera EJB, możemy nadal korzystać z CMT, jednym ze sposobów jest użycie Spring, który wykorzystuje AOP do implementacji deklaratywnego zarządzania transakcjami; Innym sposobem jest użycie Guice, która używa PersistFilter do realizacji transakcji deklaratywnej.

W CMT, kontener (bez względu na kontener EJB, Spring lub Guice) zajmie się propagacją transakcji i zatwierdzaniem/wycofywaniem;

Aplikacja zarządzana przez aplikację (AMT) różni się od CMT tym, że musimy obsługiwać transakcje programowo w naszym kodzie.

+4

Dobra odpowiedź, ale nie zapominaj, że każde oficjalne środowisko Java EE zawsze ma kontener EJB. W przeciwnym razie nie można go nazwać Java EE (Tomcat nie jest zatem oficjalnym środowiskiem Java EE). Również w Java EE przeciwieństwo CMT nazywa się BMT; Bean Managed Transactions. –

+0

Wielkie dzięki za uzupełnienie tej odpowiedzi. – aqingsao