2013-02-25 30 views
7

Mam następujący kod:Zapytania Hibernate cache

Person a = new Person(); 
a.setName("John"); 

Session session = openHibernateSession(); 

session.beginTransaction(); 

session.saveOrUpdate(a); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 

... 

session.commit(); 

Chcę to mieć zdolność do wyszukiwania obiektów zarówno z bazy danych i pamięci podręcznej Hibernate. Poniższy przykład zwraca wartość null po wywołaniu uniqueResult. Czy istnieje sposób na odzyskanie zapisanych obiektów, które nie zostały jeszcze zatwierdzone w bazie danych?

Odpowiedz

1

W przypadku wyszukiwania innego niż ID, Hibernacja nie będzie używać pamięci podręcznej pierwszego poziomu. Hibernate get and load jest domyślnie powiązany z pamięcią podręczną pierwszego poziomu, ale zapytanie o kryteria nie jest. W twoim przypadku istnieją dwa rozwiązania z mojej strony

  1. spłukując session = Wystarczy wypłukać sesji jak ta session.flush(); robiąc tak dane z sesji będą synchronizowane z bazą danych stąd Id będzie ge wytwarzanych i jako kryterium wyniku zapytania będzie znaleźć wynik w bazie danych i wyświetli listę wyników.

  2. Włączanie hibernacji cache drugiego poziomu = Możesz włączyć pamięć podręczną drugiego poziomu przez dostawców pamięci podręcznej hibernacji, takich jak ehCache i zastosować lewę.

0

Można użyć StatelessSession ale ostrzegamy: te entitys nie są zobowiązane do każdej sesji, a dostaniesz Wyjątki jeśli chcesz rozwiązać stosunki lub pól leniwych!

0
session.beginTransaction(); 

session.saveOrUpdate(a); 

session.flush(); 

Criteria critera = session.createCriteria(Person.class); 
critera.add(Restrictions.eq("name","John")); 
Person personFromCache = (Person) criteria.uniqueResult(); 
0

Robimy kilka podobnych rzeczy, z wyjątkiem korzystania z ram testowych TestNg. Kilka odpowiedzi omawia wywołanie metody session.flush(). To jest poprawne. Wywołanie funkcji Flush mówi Hibernate, aby wykonać kilka czynności, w tym upewnienie się, że wszystkie wywołania bazy danych aktualnie oczekujące w kolejce są wykonywane i usuwane z kolejki.

0

Zwraca dane, nawet jeśli wybierasz na podstawie nazwy użytkownika. Nie zwraca wartości null.