pgoetz: Loginobjekt mit Hibernate

Beitrag lesen

Guten Morgen!

[...] User schickt Name und PW an eine auth.jsp. Dort wird PW und Name mit DB abgeglichen, sobald es in Ordnung ist, wird ein Userobjekt mit ein paar Daten (alter, name, wohnort, geschlecht...) erzeugt und in die aktuelle session(ID) gespeichert.

Arbeitest Du hier ausschließlich mit JSPs? Wenn ja, dann solltest Du Dich vor der Verwendung von Hibernate erst noch kurz in Model2 bzw. MVC für Java Webanwendungen einlesen und Deine Anwendung entsprechend umstellen. Kurz gesagt geht es dabei darum, dass eine JSP ausschließlich die View einer Anwendung ist, für die Clientlogik wird ein Servlet verwendet. Das Servlet sollte dann nicht direkt mit Hibernate arbeiten, sondern den Zugriff auf die Geschäftslogik über eine Serviceklasse abkapseln. Das ist auch wichtig für die Transaktionssteuerung und die korrekte Einhaltung von Transaktionsgrenzen (s.u.).

[...]
[i]Man würde also für jeden Request das Benutzer-Objekt aus der Session laden, sich eine DB-Verbindung aus dem Pool holen und eine Transaktion
starten, das Objekt wieder an die Transaktion binden (das muss man explizit tun, wenn man Datenobjekte über mehrere Transaktionen hinweg
verwendet.)
Anschließend kann man mit dem Objekt weiterarbeiten, ohne sich um irgend etwas zu kümmern.[/i]

Ja, das ist so ungefähr richtig, ohne wirkliche Einarbeitung in das Thema Hibernate wird es aber vermutlich trotzdem noch sehr schwierig für Dich. Hibernate mappt automatisch Attribute von Klassen auf Attribute eines Datensatzes in der Datenbank. Wenn Du also von Hibernate ein Objekt aus der Datenbank ermitteln lässt, dann führt Hibernate den Select aus, ermittelt die Attribute einer oder mehrerer Relationen und legt sie in einem Objekt(graphen) ab. So lange Du Dich mit diesem Objekt in einer Hibernate Session (Achtung, hier passiert es gerne, dass man das mit der Servlet Session verwechselt) befindest, kannst Du das Objekt manipulieren und beim Verlassen der Session (Transaktionsende) werden die geänderten Attribute in der Datenbank aktualisiert.
Wenn Du jetzt aber mit Deinem Objekt die Hibernate Session verlässt (weil Du das Objekt aus dem Service an das Servlet übergibst), dann ist das Objekt "detached" und wird verwendet wir ein normales POJO sonst auch. Wenn es jetzt aber vom Benutzer geändert wird (über ein Formular, Du lädst das Objekt aus der Session, gibst ihm neue Eigenschaften und sendest es an den Service), dann muss es erst "reattached" werden, damit Hibernate wieder eine Verbindung vom Objekt zur Datenbank hat und die Attribute entsprechend aktualisieren kann (in der DB).

was meint man mit transaktion binden?

Hier ist das Reattachment gemeint. Hibernate arbeitet natürlich immer in einer Transaktion, die man deklarativ (z.B. über Spring) oder programmatisch (z.B. JTA API) steuern kann. Hierzu solltest Du die Hibernate Doku zu Rate ziehen, das führt hier zu weit: http://docs.jboss.org/hibernate/stable/core/reference/en/html/

da muss ich mich richtig gut mal in hibernate wohl einarbeiten.

Ja, das wäre passend. :)

[...]
[i]Session-Objekt muss sersialisierbar sein, Objekte sind es aber normalerweise nicht. [/i]

Das ist eigentlich die einfachste Frage an Deinem Vorgehen. ;)
Damit ein Objekt über Systemgrenzen hinweg verschickt werden kann, muss es serialisierbar sein (also in einen Bytestrom reversibel transferierbar). Das passiert in Java über das Marker-Interface java.io.Serializable. Wenn eine Klasse dieses Interface implementiert, dann wird damit versichert, dass alle Attribute serialisiert werden können (also primitive Datentypen sind oder selbst serialisierbare Objekte). Das sollte bei Hibernate POJOs immer der Fall sein, weil die ja gerne mal über verschiedene Maschinen hinweg transportiert werden.
Noch ein Hinweis, weil das früher oder später wichtig für Dich wird: Lese Dich (sofern noch nicht passiert) in die Bedeutung der Methoden equals und hashCode ein. Diese sind zwar nicht nur für Hibernate wesentlich, aber viele Java-Entwickler können trotzdem nicht damit umgehen. Es gibt auch in der Hibernate Doku ein spannendes Kapitel dazu.

Viel Erfolg bei der Verwendung von Hibernate und lass Dich nicht abschrecken. Wenn man die Konzepte mal verinnerlicht hat, ist es ein wahnsinnig gutes Werkzeug.

Peter