2009-05-20 4 views
0

hibernateSession.createQuery ("select foo where id = 1");
// Dieser Befehl gibt das Item mit der ID 1 zurück.
// [BREAK POINT STOP] ==> Ich gehe in MySQL und lösche diesen Artikel manuell.
// [BREAK POINT CONTINU]

hibernateSession.createQuery ("Wählen Sie foo where id = 1");
// Dieser Befehl gibt auch das Item mit ID 1 zurück! :-(

Es ist das gleiche mit hibernateSession.flush()/hibernateSession.clean()
Ich denke, dass ich auch nicht meine Hibernate-Cache verwenden ...Ruhezustand - Gleiches Ergebnis nach Aktualisierung/select

Antwort

1

Auf jeden Fall ein Problem Caching. Verwenden Sie die gleiche Sitzung? Versuchen Sie, die Sitzung zu schließen und eine neue ab Werk zu erhalten.

3

Die erste Abfrage hat das Objekt in die Hibernation-Sitzung geladen Ihr Löschen der Zeile in der Datenbank hat keine Auswirkungen, da Sie sind mit derselben Sitzung

Sie haben Er muss eine neue Sitzung oder evict das Objekt aus der Sitzung starten.

1

Versuchen Sie, diese

Object o = hibernateSession.createQuery("select foo where id = 1").uniqueResult(); 

// [BREAK POINT STOP] ==> I go in MySQL and I delete this item manualy. 

hibernateSession.evict(o); 
hibernateSession.createQuery("select foo where id = 1"); 

Wenn das funktioniert, dann bist du Problem mit der L1-Cache ist. Der L1-Cache befindet sich IMMER dort, ist einem bestimmten Session-Objekt zugeordnet und unabhängig vom L2-Cache, worüber alle Dokumentationen zum Hibernate-Cache sprechen. Der Zweck des L1-Cache besteht darin, die Anforderung zu erfüllen, dass, wenn Sie in derselben Sitzung zweimal dasselbe Datenbankobjekt erhalten, die beiden Referenzen r1 == r2 erfüllen.

Grundsätzlich ist die Verwendung von Ruhezustand, wenn es gleichzeitige Änderungen an der DB geben kann, nicht einfach.

Verwandte Themen