Hibernate: Säubern Sie den Cache der zweiten Ebene der Sammlung, während Sie Objekte kaskadieren

8

Ich habe ein Problem Hibernate aktualisiert den Cache der zweiten Ebene nicht für eine Sammlung von Elementen, die der Kaskadenentfernung unterliegen.

Details

Nehmen wir an, wir hätten ein Objekt Parent, das die Parent.myChildren-Sammlung von Child-Objekten enthält. Jetzt haben wir auch Objekte Menschen mit Humans.myAllHumans Sammlung und alle Eltern und Kind Objekte sind in dieser Sammlung.
Jetzt werden wir session.delete (parent) und alle untergeordneten Elemente werden aus der Datenbank entfernt, aber der Cache der Humans.myAllHumans-Sammlung wird nicht aktualisiert! Es nimmt immer noch an, dass kaskadierte gelöschte Objekte in der Datenbank sind, und wir haben die folgende Ausnahme beim Versuch, die Sammlung später zu generieren, ausgelöst:
org.hibernate.ObjectNotFoundException: Es existiert keine Zeile mit dem angegebenen Bezeichner: [foo.Child # 751]

Ansätze versucht

1) Ich habe versucht, SessionFactory.evictCollection () Ansatz, aber wie ich verstehe, ist es nicht transaktionssicher und hart entfernt Daten aus der 2. Ebene Cache, ich will das nicht.

2) Ich kann jedes Objekt auch manuell (programmatisch) aus der myAllHumans-Sammlung entfernen. In diesem Fall aktualisiert der Ruhezustand den Cache der zweiten Ebene. Dieser Ansatz möchte ich vermeiden, da er die Kaskadenlöschfunktion einfach nutzlos macht.

Erwartet

Ich möchte, dass der Ruhezustand intelligent genug ist, um den Cache der Sammlung automatisch zu aktualisieren. Ist es möglich? Ich benutze jetzt EhCache. Denkst du, dass die Verwendung einer anderen Cache-Implementierung oder die Konfiguration von EhCache helfen kann?

    
Yurii Soldak 24.09.2009, 08:57
quelle

3 Antworten

1

Das Problem ist, dass Hibernate das Löschen nicht durchführt. Die Datenbank tut dies als Teil einer Fremdschlüsselbeziehung, sodass Hibernate nie alle Objekte sieht, die möglicherweise gelöscht werden, und daher gibt es keine Möglichkeit, den Cache zu aktualisieren, der in jedem Fall funktioniert.

Ich denke, Sie sollten den Cache (oder einen Teil davon) beim Löschen löschen.

    
Aaron Digulla 24.09.2009 10:56
quelle
1

Ich habe mit anderen Problemen gekämpft, die eine Sammlung aus dem Cache entfernen müssen, und ich habe eine Lösung ausgearbeitet. Ich weiß nicht, ob es möglich ist, den Cache der Sammlung beim Kaskadenlöschvorgang automatisch zu aktualisieren, aber wenn Sie SessionFactory.evictCollection () ausprobiert haben und es funktioniert hat, denke ich, dass diese Lösung transaktionssicher sein kann und es auch funktioniert:

if (MYCOLLECTION instanceof AbstractPersistentCollection) ((AbstractPersistentCollection) MYCOLLECTION).dirty();

    
Łukasz Frankowski 19.05.2010 21:35
quelle
0

Normalerweise benötigt Hibernate eine politisch inkorrekte Aktualisierung des Objekts, um die Cahe neu zu laden.

Eine wichtige Sache ist, wie dieser EhCache die faulen Eigenschaften behandelt. Ich fand, dass das Lazy-Attribut der Sammlung nicht festgelegt ist, die Cahe aktualisiert die Objekte nicht.

Wenn in Ihrem Fall der Humans-Set des humanity-Attributs auf lazy = true gesetzt ist (Standardoption), aktualisiert ehcache es nicht, wenn das Objekt vorhanden ist. Versuchen Sie, das Lazy-Attribut der Sammlungen von Menschen und Kindern auf false festzulegen.

    
Gelvis 03.12.2009 19:39
quelle