Mein Problem ist themenübergreifend, aber ich hoffe, dass es gut in dieser Kategorie aufgehoben ist.
Generell geht es mir um das Problem, dass eine Persistenzschicht (in meinem Beispiel aufbauend auf Hibernate) andere Anforderungen an das Verwalten von Objektabhängigkeitn besitzt, als die Service-Schicht (hier: SOAP via CXF).
Als Einleitung mal ein einfaches Datenmodell für eine klassische Webanwendung.
Code:
Kunde --1-------n-- Bestellung --n-------n-- Artikel
Abgebildet wird also eine Entität Kunde, welche mehrfach bestellen kann, jede Bestellung gehört eindeutig zu einem Kunden und besteht aus mehreren Artikeln. Jeder Artikel kann natürlich Bestandteil verschiedener Bestellungen sein.
Dieses Datenmodell wird nun über Hibernate entsprechend umgesetzt, auch die Relationen werden im Mapping berücksichtigt.
Via CXF wird nun ein Set an Soap-Services zur Verfügung gestellt:
Code:
Das Hibernate-Mapping erlaubt das Laden abhängiger Objekte, was häufig, aber nicht immer gewünscht sein kann. Soll z.B. eine Liste aller Kunden abgerufen werden (listKunden()), so würden die referenzierten Bestellungen mitgeladen und via Webservice verschickt werden. Wollte der Aufrufer allerdings nur die Liste der Kunden haben - ohne Bestellungen - dann ist es zusätzlicher Overhead.
Die (vermeintlichen) Lösungen, die ich sehe sind:
Lazy Loading
Kann aktiviert werden. Hier würde das Service-Framework aber versuchen, die abhängigen Objekte nachzuladen, soabald die Kunden serialisiert werden (und es würde dank der bereits geschlossenen Session knallen).
Lazy Loading + Null setzen
Lazy Loading aktivieren (für alle Fälle, in denen es vielleicht gebraucht wird) und eine ServiceMethod anbieten, welche die Referenzen = null setzt, damit sie nicht nachgeladen werden.
Halte ich für sehr schmutzig, wartungsunfreundlich, außerdem muss sich der Aufrufende auch bewußt sein, dass er leere Referenzen erhält, die keine Aussagekraft über tatsächliche Abhängigkeiten haben.
Service mit eigenem Model
Hier würde ein eigener Service mit verändertem Model benutzt, etwa:
Code:
Dieses Model würde keine Referenzierung zu den Bestellungen enthalten. Der Aufrufende würde genau das bekommen, was er verlangt hat, eine technische Besonderheit gäbe es auch nicht. Für alle möglichen Fälle ein eigenes Model zu nutzen bedeutet Unübersichtlichkeit und viel zusätzlichen Aufwand (Pflege der Models, Persistenzcode etc)
Keine referentielle Abhängigkeit
Es wird auf das referentielle Mapping der Entitäten verzichtet. Das bedeutet, alle Objekte können nur isoliert geladen werden. Vorteile wie kaskadierendes Löschen, Laden von Objektbäumen, referentielle Integrität fallen weg. Auch kein Ausweg.
Grade in komplexerem Datenmodellen und vielfachen Anforderungen an das Laden und Verbreiten der Daten in der Business-Schicht und über die Services nimmt dieses Problem an Bedeutung zu. Allerdings dürfte es so ziemlich jede verteilte Anwendung betreffen, die in die gleiche Kategorie fällt ..
Wie wird hier für gewöhnlich mit umgegeangen?
Ich bin für jede Anregung dankbar!
Generell geht es mir um das Problem, dass eine Persistenzschicht (in meinem Beispiel aufbauend auf Hibernate) andere Anforderungen an das Verwalten von Objektabhängigkeitn besitzt, als die Service-Schicht (hier: SOAP via CXF).
Als Einleitung mal ein einfaches Datenmodell für eine klassische Webanwendung.
Code:
Kunde --1-------n-- Bestellung --n-------n-- Artikel
Abgebildet wird also eine Entität Kunde, welche mehrfach bestellen kann, jede Bestellung gehört eindeutig zu einem Kunden und besteht aus mehreren Artikeln. Jeder Artikel kann natürlich Bestandteil verschiedener Bestellungen sein.
Dieses Datenmodell wird nun über Hibernate entsprechend umgesetzt, auch die Relationen werden im Mapping berücksichtigt.
Via CXF wird nun ein Set an Soap-Services zur Verfügung gestellt:
Code:
Java:
// Liste aller Kunden
List<Kunde> listKunden()
// alle Bestellungen eines bestimmten Kunden
List<Bestellung> getBestellungen(KundenID id)
// Liste aller Artikel
List<Artikel> listArtikel()
Die (vermeintlichen) Lösungen, die ich sehe sind:
Lazy Loading
Kann aktiviert werden. Hier würde das Service-Framework aber versuchen, die abhängigen Objekte nachzuladen, soabald die Kunden serialisiert werden (und es würde dank der bereits geschlossenen Session knallen).
Lazy Loading + Null setzen
Lazy Loading aktivieren (für alle Fälle, in denen es vielleicht gebraucht wird) und eine ServiceMethod anbieten, welche die Referenzen = null setzt, damit sie nicht nachgeladen werden.
Halte ich für sehr schmutzig, wartungsunfreundlich, außerdem muss sich der Aufrufende auch bewußt sein, dass er leere Referenzen erhält, die keine Aussagekraft über tatsächliche Abhängigkeiten haben.
Service mit eigenem Model
Hier würde ein eigener Service mit verändertem Model benutzt, etwa:
Code:
Java:
List<KundeOhneBestellung> listKunden2()
Keine referentielle Abhängigkeit
Es wird auf das referentielle Mapping der Entitäten verzichtet. Das bedeutet, alle Objekte können nur isoliert geladen werden. Vorteile wie kaskadierendes Löschen, Laden von Objektbäumen, referentielle Integrität fallen weg. Auch kein Ausweg.
Grade in komplexerem Datenmodellen und vielfachen Anforderungen an das Laden und Verbreiten der Daten in der Business-Schicht und über die Services nimmt dieses Problem an Bedeutung zu. Allerdings dürfte es so ziemlich jede verteilte Anwendung betreffen, die in die gleiche Kategorie fällt ..
Wie wird hier für gewöhnlich mit umgegeangen?
Ich bin für jede Anregung dankbar!