Hibernate, Spring - excpetion i save, a sesje

0

Mam zintegrowanego Springa 4 i Hibernate 4, moja dzialajaca metoda save wyglada tak:

    @Override
    @Transactional
    public void save(A a)
    {
        Session session = this.sessionFactory.getCurrentSession();
        session.saveOrUpdate(a);
    }

Mam kilka pytań:

  1. Co się stanie jak saveOrUpdate() wyrzuci wyjatek, zostanie on zlapany wewnatrz niej... to nie fajnie, przeciez lepiej jakby on zostal wyrzucony, zebym mogl to zlapac i jakos obsluzyc, da sie takie cos osiagnac ?

  2. Czy nie bedzie tu problemu z nadmiarem stworzonych sesji, bo jak teraz patrze nigdzie nie zamykam sesji wyciagnietej z fabryki ?

0
  1. w sumie nigdy sie nad tym nie zastanawialem, ale dobre pytanie

  2. mysle ze juz spring o to dba, by usunac te sesje po kazdym zapytaniu, ale to moze odpowie ktos bardziej doswiadczony

0

Wyjątki Springa dotyczące bazy danych dziedziczą po DataAccessException, który z kolei jest wyjątkiem niekontrolowanym. Możesz ale nie musisz obsługiwać tych wyjątków.
Do konwersji wyjątków na wyjątki Springowe używa się PersistenceExceptionTranslationPostProcessor.

Nie bierz tego wszystkiego jako najpewniejszy pewnik (choć sprawdziłem;) bo sam się dopiero tego ucze ;)

0

ok, racja.

wiec moge sobie w gui go zlapac i wystarczy tam tylk ododac catcha....

a ma ktos pomysl jak dziala ten mechanizm z sesjami, czy nic w ten sposob "nie cieknie" ?

0

Wydaje mi się, powtarzam wydaje, że deklarując @Transactional masz otwieraną/zamykaną sesję przed/po metodzie.

A myślę tak dlatego, iż brak adnotacji (oczywiście nie wspominając o troszczeniu się samemu o transakcje ;)) powoduje potrzebę otwierania sesji "ręcznie" - nie zadziała getCurrentSession() w tym wypadku.

0

no racja, wykonalem ten sam test i okazalo sie ze nie ma sesji...

wiec mozna sie domyslac, ze rzeczywiscie @Transactional to zalatwia (otwieranie i zamykanei sesji)

0

wyglada na to, ze tak jest:

Spring is releasing the session, trust me, the TransactionManager is taking care of that or if you use the OpenSessionInViewFilter that is taking care of that.

Not sure what you want to my comment on, but I suggest not to use HibernateDaoSupport/HibernateTemplate as that isn't recommended anymore (use the search for the why answer).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.