Hibernate - działanie Session

0

Mam pytanko o działanie obiektu Session. Z tego co widzę po przykładach w dokumentacji gdy Hibernate wykorzystywany jest w EJB to każda metoda EJB pobiera swój własny obiekt Session przez "getCurrentSession()" i zamyka go go na koniec transakcji. Czy wynika z tego ze obiekt Session może obejmować sobą tylko działania jednej transakcji?

Jeżeli tak, to co z propagacją Persistence Contextu w Hibernate? W JPA dla EntityManagera jest to rzecz bardzo przydatna i łatwa gdy jeden EntityManager (Container Managed) jest wstrzyknięty do EJB i do niego odwołuje się kod wszystkich metod tego EJB.
W Hibernate tworzenie w każdej metodzie nowego obiektu Session chyba uniemożliwia taką propagację kontextu.

0

Uzywanie w EJB natywnych API Hibernate to troche strzal w stope - uzyj wasc go jako providera JPA, przeciez mozna, wystarczy w persistence.xml podac nazwe klasy (nie pamietam nazwy elementu), poszukaj w necie.

Hibernate ma kilka mozliwosci definiowania kontekstu dla current session. Moze to byc watek (uzywa wtedy thread local), moze byc to JTA, lub jakies Twoje wlasne. Poszukaj info na temat ustawienia hibernate.current_session_context_class.

EJB moze, jak juz wspomnialem, z powodzeniem uzywac hibernate jako providera JPA. Jesli koniecznie chcesz uzywac Session, bo jakas hibernatowa metode chcesz wywolac, to zawsze mozesz sobie EntityManagera unwrappowac, rzutowac i cuda robic. Najczesciej nie jest to potrzebne.

0

Jestem trochę nowy w temacie Hiberante i kieruję się jego dokumentacją.Tam przedstawione są przykładziki (jako norma) użycia Hibernate pod J2SE (jako aplikacja standalone) oraz w środowisku serwera JEE czyli beanach CMT i BMT. Myślisz że w EJB nie ma sensu używać API Hibernate? Czyli tylko dla aplikacji J2SE?

I z tym użyciem Hibernate tylko jako providera słabo sie wyznaję. Wiem jaką property trzeba ustawić w persistence.xml - <provider> np:

<provider>oracle.toplink.essentials.PersistenceProvider</provider>
Tylko nie bardzo rozumiem na jakiej zasadzie to działa. Jeżeli stworzę taki projekt JPA z wpisanym providerem np. TopLinkiem w persistence.xml i deployouje go na serwerze to czy to wystarczy? Serwer ma przecież swój domyślny provider (używam JBossa). Czy sam wpis w persistence.xml wyłączy provider severa czy też TopLink bedzie tylko wrapował ten provider? Gdzie powinienem umieścić biblioteki (jary) Toplinka, w projekcie czy gdzieś na serwerze?

0

Wystarczy podac providera (chyba ze serwer uzywa tej samej klasy w innej wersji, wtedy najczesciej jest lipa...). Dziala to tak ze provider JPA musi implementowac SPI dyktowane przez specyfikacje JPA, i dzieki temu serwer wie co i jak ma wywolac. W tej sposob moze tak jakby 'zmergowac' providera w swoj konener, zastepujac domyslne ustawienia.

0

Dzięki za to info bo nigdzie nie mogłem się tego doszukać. Jeszcze tylko z tymi bibliotekami providera (np. Toplinka). Dostarcza się je serwerowi osobno (jakiś katalog deployoujący) czy wystarczy że projekt (np. EAR z JPA) będzie je zawierał i serwer je znajdzie i zastosuje?

0

Jeżeli masz kilka metod w jednej transakcji i w każdej wywołasz getCurrentSession(), to za każdym razem otrzymasz ten sam obiekt sesji.

Z tego co widzę po przykładach w dokumentacji gdy Hibernate wykorzystywany jest w EJB to każda metoda EJB pobiera swój własny obiekt Session przez "getCurrentSession()" i zamyka go go na koniec transakcji.

Czy możesz wskazać miejsce w dokumentacji, gdzie jest ręcznie zamykana sesja pobrana przez getCurrentSession() ?

0

do _Krzysiek85
Moja odpowiedź jest w komentarzu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1