2012-04-24 16 views
8

Właśnie rozpocząłem prosty testowy projekt Java, który zarządza niektórymi elementami wykorzystującymi Hibernate i zapewnia interfejs REST do manipulowania tymi obiektami i zapewnienia dodatkowej logiki biznesowej. Interfejs REST jest tworzony przy pomocy RESTEasy i Jetty.Utwórz sesję hibernacji na żądanie

Wszystko do tej pory działa dobrze, ale mam wrażenie, że piszę za dużo kodu standardowego. Ponieważ nie mam dużego doświadczenia w tych frameworkach Java, zastanawiam się, czy ktoś mógłby mi wskazać, jak poprawić sytuację.

  1. Creting Hibernate Sesje na żądanie

Cóż, o ile zrozumiałem, muszę utworzyć sesji hibernacji na żądanie i na koniec muszę je zamknąć. Tak więc obecnie wszystkie moje metody obsługi wyglądają tak:

Session session = HibernateUtil.getInstance().getSessionFactory().openSession(); 
... 
... 
... 
session.close(); 

Czy istnieje sposób na usunięcie tych dwóch linii, aby w jakiś sposób zrobić to automatycznie? Obecnie moja usługa jest zarejestrowana jako singiel firmy RestEASY. Czy przejście na RESET RESSource i utworzenie sesji w konstruktorze rozwiąże problem? Myślę, że rozwiąże to problem tworzenia sesji. Ale gdzie go zamknąć?

W języku C++ można to łatwo zrobić, tworząc obiekt o zasięgu, który zamyka sesję na końcu. Ale w Javie?

  1. Zawsze, gdy takie żądanie REST zostanie wykonane, muszę sprawdzić poprawność sesji (użytkownik musi się wcześniej zalogować). Czy ServletFilter jest właściwą metodą?

Ogólne: Czy są jakieś inne wzorce lub schematy, które powinienem rozważyć? Chodzi mi o to, że chcę, aby było to tak proste, jak to tylko możliwe, a zwłaszcza, że ​​nie mam tak dużego doświadczenia, że ​​nie chcę skończyć używając Springa czy jakiejkolwiek ramy heavyweight. Wydaje mi się, że jestem przyzwyczajony do prostoty Pythona i Django, ale do tego małego projektu muszę używać Javy.

Do tej pory!

Odpowiedz

3

prąd Zalecane podejście hibernacji za zarządzanie sesjami jest szczegółowo na tej wiki page. W szczególności, myślę, że musisz przeczytać ostatni akapit:

W końcu musisz powiedzieć warstwę trwałości, że "Mam zamiar coś zrobić" (który zwykle również dostaje sesję, aby to zrobić z) i "Zrobiłem to". Możesz to zrobić za pomocą annotations lub JTA transactions, ale ta informacja musi zostać przekazana!

0

Powinieneś spróbować napisać Filtr, który to robi. Spring's OpenSessionInViewFilter jest dobrym miejscem do rozpoczęcia, jeśli potrzebujesz przykładu.

1

Wprowadź właściwości Sject Session do obiektu Data Access i użyj metody sessionFactory.getCurrentSession(), aby uzyskać dostęp do obiektu Hibernate Session. można skorzystać z którejkolwiek z klas fabrycznych dostępnych do wykonania tego ..

Następnie kod powinien wyglądać tak ..

sessionFactory.getCurrentSession().save(newInstance); 
+6

OK, ale gdzie mogę zamknąć sesję? – duselbaer

+1

W przypadku struts2, możesz użyć przechwytywaczy do zainicjowania i zamknięcia obiektu sesji. –