Java [Hibernate]Object aus Datenbank erzeugen

Black_Panter

Ensign
Registriert
Mai 2006
Beiträge
197
Hi,

ich habe mit Hibernate Objecte in eine Datenbank gemappt.

Session: http://pastebin.com/xtvyJ7Pu
SessionEntry: http://pastebin.com/zV8fuEx3
Zugehörige XML zum mappen: http://pastebin.com/G9ANpTFR

Dabei ist in Session die Variabel "session" in der Datenbank "Primary Key" und in der Klasse SessionEntry sind es die Variablen "sessionId" und "id".
In der Tabelle "session_entry" referenziert das Feld "sessionId" auf das feld "session" in der Tabelle "session".

Das Mappen an sich funktioniert auch problemlos und die Daten werden Ordnungsgemäß in die Datenbank eingefügt.
Probleme bereitet mir jetzt das auslesen.

Ich finde keine möglichkeit, wie ich unter angabe einer Session mir ein "Session"-Object automatisch erstellen lasse. Gibt es da eine möglichkeit oder muss ich mir alle Werte auslesen lassen und das "Session"-Object manuel zusammenbauen?

In Pseudo-Code soll das ganze in etwa so aussehen:
Code:
Verbindung verbindung = new Verbindung() ;
SessionObject so = verbindung.get(sessionId);
verbindung.close()

Viele Grüße
Sören
Ergänzung ()

Inzwischen habe ich rausgefunden, wie ich ein Object bekomme. Dabei ist mir jedoch ein mir gerade nicht erklärbares Phänomen aufgefallen, wesswegen ich es auch nicht zum laufen bekommen habe.

Dieser Code Funktioniert
Code:
String id = "153.100.131.14.1306901695176828";
objects.Session sessionObject = null;
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
sessionObject = (objects.Session) session.get(objects.Session.class, id);
System.out.println(sessionObject.toString());
session.close();

Wenn ich jedoch versuche das "sessionObject" nach "session.close()" zu verwenden, bekomme ich folgende Exception:
Code:
Exception in thread "main" org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: objects.Session.sessionEntrys - no session or session was closed
	at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:191)
	at org.hibernate.collection.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:183)
	at org.hibernate.collection.AbstractPersistentCollection.read(AbstractPersistentCollection.java:48)
	at org.hibernate.collection.PersistentList.iterator(PersistentList.java:106)
	at objects.Session.toString(Session.java:155)
	at logic.Main.main(Main.java:31)

Woran liegt das? Und wie kann ich das beheben?
 
Naja, wenn du die Session schließt (Stichwort destroy), danach aber noch drauf zugreifen möchtest, ist doch klar, dass das nicht geht. Du erzeugst ja kein neues SessionObject, sondern nimmst nur das aus der Session. Wenn du nun die Session schließt, ist auch die Referenz dahin.
Ich würde spontan versuchen das SessionObject zu kopieren, damit die Kopie nach der geschlossenen Session benutzt werden kann oder du schließt erst, wenn das SessionObject nicht mehr gebraucht wird.
 
Das Problem ist hat mit dem Lazy Loading von Hibernate zu tun.
Standardmäßig lädt Hibernate verknüpfte Entities erst beim ersten Zugriff darauf. Das ist auch gut, weil dadurch nicht bei jeder Abfrage der umfangreiche Objektgraph in den Speicher geladen werden muss. Dazu braucht es aber eine aktive Session.
Normalerweise sollte man die Session also erst schließen wenn man mit der Bearbeitung der Entities fertig ist. Wenn du die Session aus irgendeinem Grund vorher schließen musst, kannst du den FetchMode der entsprechenden Properties auf "Eager" stellen und so das Lazy Loading deaktivieren: Setting FetchMode in native Hibernate
 
Zurück
Oben