Hibernate und Web Services(Axis)

CoTech

Grünschnabel
Hallo zusammen.

Ich habe da so ein Problem mit Hibernate und Axis.
Es geht darum, dass ich die Persistenzierung mit Hibernate realisiert habe, dies funktioniert auch richtig wunderbar.

Jetzt ist das so, dass mehrere Clients (Struts, Swing Clints) auf die Objekte von Hibernate zugreifen sollen.

Mein Problem besteht darin, dass ich bei einer Klasse ich eine Rekursive Beziehung habe, so wie bei einer Kategorie ist Unterkategorie von Kategorie usw.

Jetzt ist das so, wenn ich z.B dieses Objekt mittels Axis den Clients zur Verfügung stelle, dass dann alle Kategorien und die Kinder mit übertragen werden. Das führt unter umständen zu Performanz Problemen.

Meine Frage ist, wie kann ich das eleganter lösen, wie sollte mein Architektur optimalerweise aussehen.

MFG
 
Hallo!

Da gäbs mehrere Möglichkeiten... kommt eben ganz auf den Ablauf an.
1) Wenn der gesamte Objektgraph zum Client geschickt werden soll, so muss dieser u.U. zuerst aus der Datenbank geladen werden. Mit der Wahl der passenden Fetching-Strategie kann man Hibernate anweisen die assoziierten Objekte (bis zu der gewünschten Tiefe) "in einem rutsch" zu laden, so dass nicht für jedes Element erneut ein SQL ausgeführt werden muss. Schau mal in der Doku nach fetch join, bzw. eager fetching und batch fetching...

2) Wenn nicht der gesamte Objektgraph zum Client geschickt werden soll, so kann man die entsprechende Attribute des gesendeten Objekt als transient deklarieren. So werden diese Attribute beim serialisieren und versenden des Objektes nicht berücksichtigt.

3) Willst du Ausschnitte eines Objektgraphen zum Client versenden kannst du diesen Ausschnitt zunächst auf Serverseite aufbauen und dann separat zum Client versenden.
...

4)...verwende von Hibernate unabhänige spezielle Transferobjekte... (ohne von Hibernate Instrumentierten Bytecode...-> Hibernate Proxies...)

5) Lade deine Objektstruktur auf der Serverseite soweit vor wie du sie am Client brauchst. Anschließend "detachst" du das root Objekt (session.evict(someObj); ) und schickst zum Client.

Gruß Tom
 
Hi

Erstmal ein grosses Dankeschön.

Also die anderen Methoden kenne ich aber die zweite variante die du mir geschildert hast kenn ich noch nicht.

Ich habe mir auch schon über legt eine Hülle für diese Objekte zu bauen und nur bei bedarf welche zu laden.
Ich dachte mir vieleicht gibt es sowas schon fertig für Hibernate.

Mal eine andere Frage würdest du EJB oder Hibernate vorziehen wenn folgendes gegeben sein muss.

1. Transactionssicherheit.
2. Zugriff über mehrere Clients.
3. n- Schichten Model
4. Jederzeit auswechselbare Datenbank.

Bye
 
Hallo!

Ich würde dir bei diesen Gegebenheiten die Kombination aus Spring Framework und Hibernate empfehlen. Solls jedoch auf biegen und brechen eine verteilte Anwendung sein mit Clustering Fail-Over und pipapo, dann und NUR dann würde ich EJB empfehlen.

Gruß Tom
 
2) Wenn nicht der gesamte Objektgraph zum Client geschickt werden soll, so kann man die entsprechende Attribute des gesendeten Objekt als transient deklarieren. So werden diese Attribute beim serialisieren und versenden des Objektes nicht berücksichtigt.

aber wenn ein Attribut als transient erklärt wurde, dann wird es auch von Hibernate nicht persistiert.

ansonsten wäre das eine gute Idee: transient Attribute gehen nicht zum Webservice
und @Transient Attribute werden nicht persisitiert

ekke
 
Hehe, der Thread ist 3 Jahre alt.

Ich bin der Meinung, dass Hibernate oder JPA basierte Domänenobjekte gar nicht per Webservice ausgeliefert werden sollten. Dafür gibt es DTOs, da WebServices eh meist nur einen Ausschnitt des Objektes liefern.

Ausserdem bindet man den Client dann nicht so stark an sein Domänenmodell.

Gruß
Ollie
 

Neue Beiträge

Zurück