Ich habe ein Problem Hibernate aktualisiert den Cache der zweiten Ebene nicht für eine Sammlung von Elementen, die der Kaskadenentfernung unterliegen.
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]
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.
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?
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.
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();
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.
Tags und Links java hibernate caching second-level-cache cascade