2011-08-08 12 views
6

Poznałem scenariusz:wyzwalacz i hibernacji

  1. save lub update niektóre dane w tabeli docelowej przez hibernacji
  2. jest wyzwalacz w tabeli docelowej, która zostanie wykonana przed insert lub update operacje tabeli docelowej
  3. select tę rekord hibernacji

Ale uważam, że pola zmodyfikowane przez wyzwalacz nie są naprawdę pobierane. Czy jest to związane z zatwierdzaniem transakcji w trybie hibernacji (funkcja flush() została już wywołana) lub pamięcią podręczną trybu hibernacji? dzięki.

Odpowiedz

4

Może to być spowodowane przez pierwsze (sesyjne) lub drugie (np. Ehcache) pamięci podręczne. Aby ponownie przeczytać encję, musisz wywołać session.refresh().

Od hibernate docs (w dolnej części)

Jest możliwe, aby ponownie załadować obiekt i wszystkie swoje zbiory w dowolnym czasu stosując metodę refresh(). Jest to przydatne, gdy wyzwalacze bazy danych są używane do zainicjowania niektórych właściwości obiektu.

sess.save(cat); 
sess.flush(); //force the SQL INSERT 
sess.refresh(cat); //re-read the state (after the trigger executes) 
9

Można mapować właściwości jak generated values. Wartości te zawsze pochodzą z bazy danych i nie mogą być przechowywane. Hibernate automatycznie ładuje te wartości w kolejnych zapytaniach po wstawieniu lub aktualizacji bazy danych.