# Hibernate: failed to lazily initialize a collection of role



## Laurin (13. Okt 2011)

Hi,

ich brauche eine Lösung um ein vollständig geladenes Objekt aus Hibernate zu bekommen.
So sieht der Code aus, der das Objekt holt:


```
@Override
  public ResultObject getResultObjectByCall(Call call, String callParameter) {
    List<ResultObject> results = hibernateTemplate.find("FROM DefaultResultObject WHERE call = ? AND callParameter = ?", new Object[]{call, callParameter});
    if (results.isEmpty()) {
      return null;
    }
    ResultObject resultObject = results.get(0);
    return resultObject; //<-- This ****ing object shall contain all object information
  }
```

Ich erhalte aber immer den Fehler "failed to lazily initialize a collection of role", wenn ich auf z.B. resultObject.getCollection() zugreifen will.

Es gibt hierzu zwar schon viele Informationen im Internet, aber keine ist in meinem Fall hilfreich:
1) Alle nötigen Objektzugriffe innerhalb einer Transaction durchführen: Ungeeignet, da das Projekt eine Schnittstelle ist, die so ein Objekt auch zu anderen Applikationen nach "draußen" liefert.

2) Mit Annotations das Verhalten auf "EAGER" setzen: Es kommt bei mehr als einer Collection die Exception "cannot simultaneously fetch multiple bags".

3) "hibernateTemplate.evict(resultObject);" vor dem return hat gar nichts geändert.

4) In der DAO Klasse sollen die Collections einmal aufgerufen werden. Ersten ist die Session schon direkt nach den hibernateTemplate.find zu und zweitens kenne ich die Collections nicht, denn ResultObject ist ein Interface und DefaultResultObject abstract. Es gibt ca. 100 verschiedene abgeleitete Result Object Klassen und ich werde sicher nicht für jede eine eigene DAO schreiben.

Also, wie zum Henker kriege ich das vollständige Objekt in die Variable rein?

Viele Grüße
Laurin


----------



## SlaterB (13. Okt 2011)

es gibt die Methode Hibernate.initialize(), aber die wird sicher nicht tief genug gehen,
vielleicht macht sie gar nichts mit dem Objekt selber, müsste auch schon mit der Collection aufgerufen werden



> Force initialization of a proxy or persistent collection.
> 
> Note: This only ensures intialization of a proxy object or collection; it is not guaranteed that the elements INSIDE the collection will be initialized/materialized.



------

Reflection kann dir bei beim Durchlauf aller Attribute eines Objektes/ einer Klasse helfen,
damit rekursiv vorgegangen, nach Collections oder einzelnen DB-Objeken Ausschau haltend, könntest du alles finden

was genau ist aber eigentlich ein ResultObject? 
wenn es die Methode getCollection() schon im Interface gibt, so allgemein wie sie klingt, dann könntest du sie doch auch allgemein aufrufen,
die weiteren Ergebnisse durchlaufen können?
was sind die Elemente, wieder ResultObjects, evtl. mit weiteren Collections? alle durchlaufen,

falls die Unterklassen auch andere zu initialisierende Objekte haben könntest du im allgemeinen Interface eine zusätzliche Methode getAllInterestingInAnotherCollection() einfügen, die dann jede Klasse bei Bedarf implementiert, 
das kommt dann allerdings dem Schreiben von 100 DAO bereits nahe, was immer du damit genau meintest


----------



## Laurin (13. Okt 2011)

In den Objekten steht alles Mögliche drin, getCollection war nur ein Beispiel.
Im Interface/der abstrakten Parent-Klasse stehen nur generelle Informationen (ID, hasError/getError, timestamp), in den anderen Objekten stehen die unterschiedlichsten Sachen, unter anderen auch Maps/Listen/Sets von anderen Objekten, auch ineinander verschactelt (z.B. Map<KlasseA, List<Set<KlasseB>>>).

Aber wer hat sich diesen Mist auch ausgedacht, das muß doch berücksichtigt worden sein, daß am Ende ein Objekt rausfällt, das auch alle Nutzdaten beinhalten, die in der Datenbank stehen...


----------



## SlaterB (13. Okt 2011)

eine komplexe Arbeit ist es so oder so, die Daten müssen einzeln geladen werden,
eine allgemeine Lösung von Hibernate wäre auch nur Rekursion und Reflection, generisches Abfragen aller Attribute,

das gibts anscheinend nicht, kann man bemeckern, ja, aber soviel Arbeit ist das doch auch nicht,
sei froh, dass es die restlichen 99.99% von Hibernate schon gibt 

ein Link den ich nebenher gefunden habe, lose vielleicht deinem Thema nahe:
Hibernate, Get Out of My POJO! | mojavelinux.com


----------

