DarthShader
Erfahrenes Mitglied
Hallo zusammen,
ich möchte ein Objekt via Hibernate aus der Datenbank laden und es nach Schließen der Session verwenden. Ich weiß um den Mechanismus mit der Instrumentation und dem Lazy Loading, sodass das Objekt nach und nach die gewünschten Properties bei Zugriff nachlädt.
Nun dachte ich jedoch, dass das Flushen und/oder Schließen der Session bewirkt, dass das Objekt vollständig geladen wird, dies scheint aber nicht der Fall zu sein.
Hier ein kleines Beispiel:
Führe ich das aus, wirft er eine
Exception - was ja auch verständlich ist, denn ich greife ja auf das Objekt, welches noch nicht vollständig geladen ist, zu, obwohl die Session geschlossen ist. Allerdings dachte ich, dass wegen (5) und/oder (6) das Objekt vollständig geladen wird. Denn was macht es für einen Sinn, noch nicht vollständig geladene Objekte (attached) zu haben, jedoch eine geschlossene Session?
Ich kenne nur einen "Workaround", um das zu umgehen (bzw. das Objekt zu "detachen"): man cloned es, z.B. mit "Dozer".
Über Eure Hilfe würde ich mich sehr freuen
Vielen Dank!
ich möchte ein Objekt via Hibernate aus der Datenbank laden und es nach Schließen der Session verwenden. Ich weiß um den Mechanismus mit der Instrumentation und dem Lazy Loading, sodass das Objekt nach und nach die gewünschten Properties bei Zugriff nachlädt.
Nun dachte ich jedoch, dass das Flushen und/oder Schließen der Session bewirkt, dass das Objekt vollständig geladen wird, dies scheint aber nicht der Fall zu sein.
Hier ein kleines Beispiel:
Java:
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Plane plane = new Plane();
plane.setName( "Ein Flugzeug" );
session.save( plane );
transaction.commit(); // (1)
session.close(); // (2)
session = sessionFactory.openSession(); // (3)
transaction = session.beginTransaction(); // (4)
Plane loadedPlane = (Plane)session.load( Plane.class, plane.getId() );
session.clear(); // (5)
session.flush(); // (6)
transaction.commit();
session.close();
sessionFactory.close();
System.out.println();
Führe ich das aus, wirft er eine
Java:
org.hibernate.LazyInitializationException: could not initialize proxy - no Session
Exception - was ja auch verständlich ist, denn ich greife ja auf das Objekt, welches noch nicht vollständig geladen ist, zu, obwohl die Session geschlossen ist. Allerdings dachte ich, dass wegen (5) und/oder (6) das Objekt vollständig geladen wird. Denn was macht es für einen Sinn, noch nicht vollständig geladene Objekte (attached) zu haben, jedoch eine geschlossene Session?
Ich kenne nur einen "Workaround", um das zu umgehen (bzw. das Objekt zu "detachen"): man cloned es, z.B. mit "Dozer".
- Etwas, was ich nicht begreife ist, warum mit (1) bis (4) eine Exception geworfen wird. Nehme ich diese Zeilen nämlich raus, so wird keine Exception geworfen - kann mir das jemand erklären?
- Gibt es einen anderen Weg, um das Objekt vollständig zu laden, wenn die Session geschlossen wird (ja, ich möchte Lazy Loading ansonsten aktiviert lassen)?
Über Eure Hilfe würde ich mich sehr freuen
Vielen Dank!