2012-03-29 16 views
0

Ich bin hier für ein paar Tipps. Ich verwende Hibernate mit Java. Ich habe eine Controller-Schnittstelle implementiert, um die Benutzerschnittstelle von der eigentlichen Kommunikation mit der Datenbank zu trennen. Für die angegebene Schnittstelle habe ich eine Datenbank-Controller-Klasse implementiert, die die eigentliche Kommunikation durchführt. Dies wird von einer statischen Steuerungsfabrik an die Benutzerschnittstelle geliefert.Hibernate Beratung (Sitzung offen halten)

Jetzt entdecke ich, dass der Ruhezustand nicht wirklich alles lade ich in den Speicher werden soll. Für jeden Controller-Methodenaufruf öffne ich immer die Sitzung, mache meine Sachen und schließe die Sitzung. Deshalb, wenn ich versuche, meine Objektstruktur zugreifen Ich bin mit Fehlern aufgefordert, dass

could not initialize proxy - no Session 

Mit wenig Aufwand und googeln ich festgestellt, dass das Objekt, an den mein aktives Objekt referenziert wird, ist nicht im Speicher.

Jetzt habe ich die Möglichkeit, die Sitzung geöffnet von dem Moment an halten ich meine Objekten mit bis zum Ende beginnen. Aber es scheint ein bisschen redundant und energieeffizient. Ich denke, ich werde nicht viel verlieren, wenn ich die Sitzung offen halte, aber ich habe irgendwie beabsichtigt, die Benutzeroberfläche rein aus dem Datenbankgeschäft herauszuhalten. Wenn meine Controller-Schnittstelle eine "tearDown" -Methode (und "setUp" -Methode) für die Benutzerschnittstelle hat, scheint sie der gegebenen Logik etwas entgegenzusetzen.

+1

wir brauchen möglicherweise mehr Details zu Ihrer Frage, aber ich schlage vor, Sie überprüfen http://StackOverflow.com/Questions/8493087/hibernate-to-be-la-or-not-to-be-lazy – kommradHomer

+0

Ich bekomme tatsächlich die Grund und ich bekomme, wie ich es vermeiden kann. Ich denke, ich hätte mehr in Richtung Software Engineering. Ich denke, ich wollte herausfinden, was der Standard beim Umgang mit ORM ist, da ich es zum ersten Mal benutze. – Vampnik

Antwort

0

Ich verstehe nicht. Sie können Entitätsobjekte aus der Datenbank laden und nach dem Schließen der Sitzung verwenden. Die Objekte werden dann getrennt. Sie müssen sie möglicherweise manchmal wieder an die Sitzung anfügen, um ihre Zustände mit db zu synchronisieren.

1

Wenn Sie verzögertes Laden verwenden - das ist ziemlich oft der Standardfall in Hibernate - Sie können nicht den Zugang zu unbelasteten Instanzen haben, nachdem die Sitzung geschlossen.

Zum Beispiel haben Sie eine übergeordnete Tabelle und eine Kind-Tabelle, die in einer 1 zugeordnet ist: n-Beziehung (In der Mapping-Datei oder als Anmerkung). Dann tun Sie wie folgt aus:.

1) offene Sitzung
2) Last Mutter
3) schließen Sitzung
4) rufen parent.getChild() (oder etw wie diese)
dann in Schritt 4) Sie erhalten eine Fehlermeldung, weil Hibernate das Element zuvor nicht geladen hat, jetzt möchte es (lazy loading), aber es kann nicht, da die Sitzung bereits geschlossen ist.

Wenn Sie die Sitzung schließen möchten, stellen Sie sicher, dass alle notwendigen Daten bereits geladen ist. Zum Beispiel, wenn Sie Schritt 4) vor Schritt 3) in diesem Beispiel getan hätten, dann hätte es funktioniert, und nach dem Schließen der Sitzung könnten Sie sogar wieder auf dieses Kind zugreifen, da es bereits geladen wäre. Aber Sie könnten es später wegen der geschlossenen Sitzung nicht in der Datenbank speichern.

Verwandte Themen