Hibernate: Refresh, Evict, Replicate and Flush
Chciałbym wiedzieć, co dokładnie robi każdy element na tej liście, jak to działa, jakie konsekwencje i kiedy jest właściwy czas do wykorzystania.
- odśwież
- Eksmisja
- Replikuj
- Flush
Zastanawiam się nawet, co każdy z nich robi, ale nie jestem do końca pewien, więc proszę o pomoc, bo naprawdę chcę to zrozumieć.
Wiem, że to dość ogólne pytanie, ale myślę, że naprawdę warto wiedzieć o tym wszystkim.
Dzięki.3 answers
The Hibernate Documentation daje dobre przykłady tego. Również ten post na blogu da ci trochę wglądu. Dodam kilka linijek poniżej.
Możliwe jest ponowne załadowanie obiektu i wszystkich jego zbiorów w dowolnym momencie, przy użyciu metody refresh()
. Jest to przydatne, gdy wyzwalacze bazy danych są używane do inicjalizacji 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)
Zobacz tutaj aby uzyskać więcej przykładów.
Ilekroć przekazujesz obiekt do save(), update() or saveOrUpdate()
, a za każdym razem, gdy odzyskujesz obiekt za pomocą load(), get(), list(), iterate() or scroll()
, Obiekt ten jest dodawany do wewnętrznej pamięci podręcznej sesji.
Po wywołaniu flush()
Stan tego obiektu zostanie zsynchronizowany z bazą danych. Jeśli nie chcesz, aby ta synchronizacja miała miejsce, lub jeśli przetwarzasz ogromną liczbę obiektów i musisz efektywnie zarządzać pamięcią, metoda evict()
może być użyta do usunięcia obiektu i jego kolekcji z pamięci podręcznej pierwszego poziomu.
ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set
while ( cats.next() ) {
Cat cat = (Cat) cats.get(0);
doSomethingWithACat(cat);
sess.evict(cat); // (if gives the compile time error then use it: sess.evict(cat.getClass());
}
Czytaj pełny przykład z tutaj .
Przeczytaj o API sesji tutaj .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-16 12:11:37
replicate()
jest przeznaczony do stosowania zamiast save()
/persist()
Kiedy trzeba zapisać encję z danym identyfikatorem, pomimo faktu, że identyfikator tego encji jest skonfigurowany do generowania.
Jest to przydatne, gdy niektóre encje (być może pochodzące z systemów zewnętrznych) mają wcześniej istniejące identyfikatory, podczas gdy inne encje tego samego typu wymagają wygenerowania swoich identyfikatorów.
Jednak ze względu na długotrwały błąd w Hibernate (HHH-1459, HHH-2716)replicate()
nie działa zgodnie z oczekiwaniami w przypadku niektórych rodzajów generatorów id. Ten problem ogranicza użyteczność replicate()
i wymaga wdrożenia nieprzyjemnych obejść, aby emulować jego zachowanie, jeśli Twoja strategia generatora id jest naruszona i nie możesz jej zmienić.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-15 14:26:37
-
session.flush()
spłukanie sesji wymusza synchronizację stanu sesji w pamięci z bazą danych. -
session.evict()
Odłącz obiekt od pamięci podręcznej sesji. Po odłączeniu obiektu od sesji żadna zmiana w obiekcie nie będzie trwała. -
session.refresh()
załaduj ponownie wszystkie dane. -
session.replicate()
Dane są replikowane w różnych Datastore w różnych trybach.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-03 09:20:22