2013-02-25 6 views
7

Ich habe den folgenden Code:Querying 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(); 

Was ich will, ist die Fähigkeit haben Objekte aus zu suchen, die Datenbank und Cache des Hibernate. Das folgende Beispiel gibt null zurück, wenn uniqueResult aufgerufen wird. Gibt es eine Möglichkeit, gespeicherte Objekte abzurufen, die noch nicht in die Datenbank übernommen wurden?

Antwort

1

Wenn Sie eine andere ID als ID suchen, wird Hibernate den Cache der ersten Ebene nicht verwenden. Hibernate get and load bezieht sich standardmäßig auf den Cache der ersten Ebene, die Kriterienabfrage jedoch nicht. In Ihrem Fall gibt es zwei Lösung von meiner Seite

  1. Durch das Spülen session = spült Ihre Sitzung Genau wie diese session.flush(); während dabei Daten von Sitzung zu Datenbank werden synchronisiert werden daher Id wird ge erzeugt und als Abfrageer Kriterien finde das Ergebnis in der Datenbank und erhalte die Ergebnisliste.

  2. Aktivieren des Ruhezustand-Second-Level-Cache = Sie können den Second-Level-Cache durch Hibernate-Cache-Provider wie ehCache aktivieren und den Trick anwenden.

0

können Sie die StatelessSession verwenden, aber seien Sie gewarnt: diese Entitys sind nicht auf eine Sitzung gebunden und Sie werden Ausnahmen, wenn man Beziehungen oder faul Felder lösen gerne!

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

Wir machen einige ähnliche Dinge außer mit TestNg Test Framework. In mehreren Antworten wird der Aufruf session.flush() beschrieben. Das ist richtig. Der Aufruf zum Leeren weist Hibernate an, mehrere Dinge zu tun, einschließlich sicherzustellen, dass alle derzeit in der Warteschlange wartenden Datenbankaufrufe ausgeführt und aus der Warteschlange gelöscht werden.

0

Es gibt Daten zurück, auch wenn Sie auf der Grundlage von Benutzernamen auswählen. Es gibt nicht null zurück.

Verwandte Themen