Hibernate Envers: Suche in Collections

Hibernate EnversIn vielen Softwareprojekten fällt die Wahl bei der Java Persistence API (JPA)-Implemetierung auf Hibernate. Wie schon im Beitrag „Auditing mit Hibernate Envers“ beschrieben, kann man mit Hibernate Envers Änderungen am Datenbestand speichern und abfragen. Die Abfrage der Audit-Tabellen erfolgt analog der üblichen Hibernate Queries und die Syntax ist sehr ähnlich.

In einem Projekt ist kürzlich bei der Suche in den Änderungen folgende Fehlermeldung aufgetreten:

Die Fehleranalyse

Was war passiert? Beide Klassen wurden erzeugt und mit @Audited annotiert. Wie man sieht, gibt es eine Verbindung zwischen den Klassen, denn eine „Entenmutter“ hat mehrere „Entenküken“.

Für die Anzeige der Daten wurde ein Filter verwendet, der auf verschiedene Eigenschaften filtern kann; z.B. können alle „Entenküken“ gefunden werden, deren Namen mit “La” beginnen (das würde die Suche in Zeile 2 erledigen). Der Filter kann auch mit einer Liste von Parametern arbeiten, wenn man z.B. alle Entenküken der Enten-Mütter “Martha, Berta und Daisy” sehen möchte (Zeile 4).
Der Filter sieht dann so aus:

Das Problem ist die Anweisung “property(parameterName).in” in Zeile 4. Anscheinend kann Hibernate Envers (in Version 4.1.2.Final) dies nicht richtig auflösen. Es ist zwar gültiger Code und die JavaDoc gibt auch keinen Hinweis, warum dies nicht erlaubt sein sollte, aber genau an dieser Stelle wird die oben angegebene Exception geworfen.

Die Problemlösung

Die Lösung für das Problem war, die “in” Anweisung durch geschachtelte “or” Anweisungen zu ersetzen. Also z.B. so:

und einer Methode, die die “or” Anweisung umsetzt
Es wäre natürlich schöner, wenn der ursprüngliche Code funktionieren würde. Solange Hibernate diese Stelle nicht repariert, ist dieser Workaround jedoch eine Möglichkeit, die gewünschte Suche durchzuführen.

Zurück zur Übersicht

Ein Kommentar zur “Hibernate Envers: Suche in Collections

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*Pflichtfelder

*