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.

  1. odśwież
  2. Eksmisja
  3. Replikuj
  4. 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.
Author: caarlos0, 2011-11-15

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 .

 44
Author: ManuPK,
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ć.
 11
Author: axtavt,
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.
 4
Author: Premraj,
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