2011-09-17 12 views
5

Jestem nowy w hibernacji i rozpocząłem naukę w hibernacji. Rozdział, w którym działam, wykorzystuje hibernację z JDBC() Moje pierwsze pytanie to Czy hibernacja używa jdbc wewnętrznie lub JTA wewnętrznie, aby wykonać trwałe i uzyskać operacje? Ale widzę niektóre wzmianki o JTA również tutaj, podobnie jak getCurrentSeessionSession() metoda uzyskuje sesję związaną z bieżącą transakcją JTA Pytanie: - Zasadniczo chcę zrozumieć rolę JTA i jdbc w hibernacji:Czy hibernacja używa wewnętrznie jtbc lub JTA wewnętrznie, czy można go skonfigurować? "

Pytanie2: - Widzę poniższy fragment kodu w dowolnej operacji hibernacji

try{ 
session=factory.openSession(); 
tx=session.beginTransaction(); 
session.save(myClass); 
tx.commit(); 
} 
finally{ 
session.close(); 
} 

Tutaj chcę zrozumieć rolę linii // tx = session.beginTransaction(); Zgodnie z rozumieniem każda sesja będzie korzystała z jednego połączenia. Nawet jeśli uruchomimy wiele transakcji z tej samej sesji, będziemy używać tego samego połączenia. po zatwierdzeniu konkretnej transakcji wszystkie transakcje utworzone z tej samej sesji zostaną zatwierdzone jednokrotnie. Więc co próbujemy osiągnąć za pomocą // tx = session.beginTransaction(); ?

Odpowiedz

12

Czy hibernacja używa wewnętrznie jdbc lub wewnętrznie JTA do wykonywania trwałych operacji?

JDBC i JTA nie są wymienne. JDBC is the standard API, których aplikacje Java używają do interakcji z bazą danych. JTA is the standard API do zarządzania transakcjami z jednego lub więcej zasobów. Najbliższa odpowiedź na twoje pytanie brzmi "wewnętrznie", Hibernate używa JDBC do interakcji z bazą danych.

Podobnie jak metoda getCurrentSeessionSession() uzyskuje sesję powiązaną z bieżącą transakcją JTA.

Niezupełnie. SessionFactory.getCurrentSession() otrzymuje sesję zgodnie z current session context. Jedną z implementacji tej strategii jest JTA session context, która zasadniczo wiąże sesje z transakcją JTA. Transakcja JTA nie "ma" sesji hibernacji, ponieważ JTA nic nie wie o Hibernate, i nie byłoby całkiem dobrze powiedzieć, że Hibernate używa wewnętrznie JTA. Po prostu ma możliwość integracji z JTA i pozwala zarządzać transakcjami.

tutaj chcę zrozumieć rolę linii // tx = session.beginTransaction();

Rozpoczyna transakcję w dowolnym mechanizmie transakcji, którego używasz, który jest w użyciu przy użyciu TransactionFactory. Na przykład, z JDBCTransactionFactory, po prostu zapewnia, że ​​auto-commit jest wyłączony, aby zmiany nie zostały zatwierdzone do czasu zakończenia transakcji.

Po zatwierdzeniu konkretnej transakcji wszystkie transakcje utworzone z tej samej sesji zostaną zatwierdzone jeden raz.

W normalnych okolicznościach sesja jest powiązana tylko z jedną transakcją. Wiele wywołań do Session.beginTransaction() będzie po prostu return the same underlying Transaction.

Więc co staramy się osiągnąć // tx = session.beginTransaction()

Wystarczy, że: powiedzieć cokolwiek zarządzania transakcjami, że zaczynasz nową transakcję. Oznacza to, że wszystko, co dzieje się do momentu zatwierdzenia() lub wycofania(), powinno mieć ogólnie przyjętą semantykę database transaction.

+0

Dzięki Ryan Za tak piękną odpowiedź. Jeszcze tylko dwa punkty. Jak powiedziałeś: "JDBC to standardowy interfejs API, którego aplikacje Java używają do interakcji z bazą danych" Czy mogę powiedzieć, że każda aplikacja java użyje jdbc do połączenia się z bazą danych jawnie lub wewnętrznie (w przypadku dowolnych narzędzi takich jak hibernacja) lub EJB. Powiedziałeś, że "JTA to standardowy interfejs API do zarządzania transakcjami z jednego lub więcej zasobów." Mam ten scenariusz w aplikacji java Mam dwa różne schematy jako bazy danych. Tutaj nadal będę używać jdbc zarówno dla bazy danych/schematu. Również będę używać JTA tutaj, aby zarządzać ciągłym ..... –

+0

ciąg dalszy ... transakcje na obu schematów.Ręczne? –

+0

@Mohit: Byłaby to wyjątkowo rzadka aplikacja Java, która łączy się z bazą danych inną niż JDBC. Nigdy o nim nie słyszałem, ale * mogło * się wydarzyć. Jeśli chodzi o JTA, to tylko interfejs API transakcji JEE. Istnieją inne sposoby zarządzania transakcjami, takie jak zarządzanie transakcjami w Spring (które może również zintegrować się z JTA). Jeśli chcesz transakcji rozproszonych, nie wiem zbyt wiele o nich, ale myślę, że prawdopodobnie będziesz chciał skorzystać z implementacji JTA. –

Powiązane problemy