Hallo,
habe mich nun einmal mit dem Preload-Pattern für Hibernate aus dem Java Magazin (Ausgabe: April 2008) beschäftigt und festgestellt, dass der Code fehlerhaft ist.
Wenn man dem GenericDao beispielsweise eine Methode findAll(Preload[] preloads) spendiert, dann wird gar nichts vorgeladen. Schuld daran ist folgende Zeile:
Die übergebene Entität ist in diesem Fall ja eine Collection und die ist schon von Hibernate initialisiert, d.h. die Preload-Methode wird an dieser Stelle beendet ohne die preloads vorzuladen. Kommentiert man den Code-Block aus, dann funktioniert es. Allerdings wird es dann wohl zu ner Endlosrekursion kommen bei bidirektionalen Verbindungen - das habe ich allerdings noch nicht getestet.
Hat das jemand schonmal ausprobiert und eine hübsche Lösung für das Problem? Eine Möglichkeit wäre, dass man sich die Referenzen der Objekte merkt, welche schon abgearbeitet wurden, um somit eine Endlosrekursion zu verhindern. Finde ich aber eher unschön, zumal es auch Speicher kostet.
Hat jemand eine bessere Idee?
Gruß byto
habe mich nun einmal mit dem Preload-Pattern für Hibernate aus dem Java Magazin (Ausgabe: April 2008) beschäftigt und festgestellt, dass der Code fehlerhaft ist.
Wenn man dem GenericDao beispielsweise eine Methode findAll(Preload[] preloads) spendiert, dann wird gar nichts vorgeladen. Schuld daran ist folgende Zeile:
Code:
if(Hibernate.isInitialized(entity)) {
return;
}
Die übergebene Entität ist in diesem Fall ja eine Collection und die ist schon von Hibernate initialisiert, d.h. die Preload-Methode wird an dieser Stelle beendet ohne die preloads vorzuladen. Kommentiert man den Code-Block aus, dann funktioniert es. Allerdings wird es dann wohl zu ner Endlosrekursion kommen bei bidirektionalen Verbindungen - das habe ich allerdings noch nicht getestet.
Hat das jemand schonmal ausprobiert und eine hübsche Lösung für das Problem? Eine Möglichkeit wäre, dass man sich die Referenzen der Objekte merkt, welche schon abgearbeitet wurden, um somit eine Endlosrekursion zu verhindern. Finde ich aber eher unschön, zumal es auch Speicher kostet.
Hat jemand eine bessere Idee?
Gruß byto