Hallo liebe Hibernate-Community,
ich komme noch nicht wirklich mit dem Umgang mit der Session klar:
Ich benutze das Session-per-request-Pattern, welches in meinem Code dann beispielsweise so aussieht:
Code:
public static Album getAlbum(int id)
{
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Album result = (Album) session.load(Album.class, id);
session.getTransaction().commit();
return result;
}
Es wird also eine Session erzeugt, das Album-Objekt aus der Datenbank geladen und danach mit "commit" die Session ins Nirvana geschickt. Soweit klar.
Ich habe hauptsächlich die Klassen Bild und Album. Zwischen Album und Bild besteht eine Assoziation. Nun möchte ich ein Album-Objekt mit obiger Methode aus der Datenbank laden und danach folgendermaßen die Assoziation benutzen:
Code:
int bilderInAlbum = meinAlbum.getBilder().size()
(getBilder liefert eine ArrayList zurück, mit der die Assoziation realisiert wird.)
Dabei bekomme ich jedoch leider folgende Exception:
Code:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Hibernate kann die Bilder aus der ArrayList nicht nachladen, da die Session ja geschlossen ist. Also habe ich zunächst versucht, LazyLoading auf folgende Weise zu deaktivieren, indem ich die Assoziation zu den Bildern auf Fetch=Eager gestellt habe:
Code:
@OneToMany(mappedBy = "album",fetch=FetchType.EAGER)
List<Bild> bilder = new ArrayList<Bild>();
Dies hat jedoch keine Abhilfe geschaffen. Und genau hier hänge ich, da durch das deaktivierte Lazy-Loading Hibernate die Bild-Objekte ja direkt beim Auslesen der Album-Objekte mitnehmen müsste. Dies tut er aber offensichtlich nicht. Kann mir jemand erklären warum, und wie ich das Problem löse?
Ich habe eine Möglichkeit gefunden, dass Problem zu umgehen, indem ich bei einem reinem laden eines Objektes die Session einfach nicht mehr committe. Dadurch entsteht jedoch das Problem, dass Hibernate auf einmal verschiedene Sitzungen hat, sodass wenn man Objektattribute ändert, in die Datenbank schreibt, und dann per Hibernate darauf zugreift, die Objektattribute zufällig die alten oder die neuen Werte haben können. Dies ist also auch keine Lösung.
Ich bitte um Aufklärung.
Vielen Dank schon einmal. Bin leider noch ein Hibernate-Anfänger.