Hallo liebes Forum,
Hibernate gefällt mir im Augenblick sehr gut, vor allem dieses "LazyLoading" hat es mir angetan.
Ich habe das aus einem Buch entnommene Beispiel von einer Pizzerienverwaltung nach und nach so umgebaut, dass das ganze Verteilt als RMI-Applikation läuft.
Auf dem Server läuft also die Logik der Datenstruktur und stellt Schnittstellen (Controller) zur Verfügung, auf dem Client läuft nur die GUI die Anfragen an den Controller schickt.
Rein Programmtechnisch ist das ganze herrlich, da schieße ich nur Objekte zwischen Server und Client hin und her, die Controller sind halt über RMI vom Client aus ansprechbar.
So kann ich mir problemlos zum Beispiel eine Objekt der Klasse Pizza vom Server beschaffen. Die Klasse Pizza gibt es sowohl auf dem Server als auch auf dem Client, ich frage den Server nach einem Pizza Objekt und der sendet sie mir zu (RMI Methodenaufruf).
Nun hat aber auch jede Pizza Belag, jeder Belag wird durch die Klasse "Topping" repräsentiert.
Pizza und Topping stehen in einer 1:N-Beziehung, im Programm mit Hibernate daduch gelöst, dass Pizza eine Funktion List<Topping> getToppings() besitzt.
Das funktioniert bei einer normalen, lokalen Anwendung problemlos.... und macht richtig Spaß.
Rufe ich ein Objekt "Pizza" ab, dann kann ich auf alle Felder zugreifen, greife ich per getToppings auf die Beläge zu schmeißt im Hintergrund Hibernate schnell eine Anfrage an und holt mir die Toppings zur Pizza. Die Daten werden also wirklich nur dann geholt wenn sie gebraucht werden. Das spart Resourcen und Zeit.
Das funktioniert aber logischerweise nicht wenn ich das Pizza-Objekt per RMI zum Client übertragen habe.
Dort gibt es keine Hibernate-Instanz und dementsprechend keine Hibernate-Session die aber offensichtlich gebraucht wird um eine LazyLoading-Verknüpfung aufzulösen.
Hat jemand eine Ahnung wie es trotzdem funktioniert? Diese "Laden bei Bedarf"-Geschichte gefällt mir nämlich sehr gut.
Natürlich gibt es auch die Möglichkeit dafür zu sorgen, dass die Verknüpfung der Objekte statisch geschieht. Dann würde Hibernate immer wenn ein Pizza-Objekt geladen wird auch die Toppings mitladen. Dann funktioniert auch das übertragen per RMI problemlos.... aber irgendwie fühlt sich das an als würde das wichtigste Feature von Hibernate nicht genutzt werden
Vielleicht kennt ja jemand das Problem und hilft mir weiter.
Ich danke!
Gruß Sparrow
Hibernate gefällt mir im Augenblick sehr gut, vor allem dieses "LazyLoading" hat es mir angetan.
Ich habe das aus einem Buch entnommene Beispiel von einer Pizzerienverwaltung nach und nach so umgebaut, dass das ganze Verteilt als RMI-Applikation läuft.
Auf dem Server läuft also die Logik der Datenstruktur und stellt Schnittstellen (Controller) zur Verfügung, auf dem Client läuft nur die GUI die Anfragen an den Controller schickt.
Rein Programmtechnisch ist das ganze herrlich, da schieße ich nur Objekte zwischen Server und Client hin und her, die Controller sind halt über RMI vom Client aus ansprechbar.
So kann ich mir problemlos zum Beispiel eine Objekt der Klasse Pizza vom Server beschaffen. Die Klasse Pizza gibt es sowohl auf dem Server als auch auf dem Client, ich frage den Server nach einem Pizza Objekt und der sendet sie mir zu (RMI Methodenaufruf).
Nun hat aber auch jede Pizza Belag, jeder Belag wird durch die Klasse "Topping" repräsentiert.
Pizza und Topping stehen in einer 1:N-Beziehung, im Programm mit Hibernate daduch gelöst, dass Pizza eine Funktion List<Topping> getToppings() besitzt.
Das funktioniert bei einer normalen, lokalen Anwendung problemlos.... und macht richtig Spaß.
Rufe ich ein Objekt "Pizza" ab, dann kann ich auf alle Felder zugreifen, greife ich per getToppings auf die Beläge zu schmeißt im Hintergrund Hibernate schnell eine Anfrage an und holt mir die Toppings zur Pizza. Die Daten werden also wirklich nur dann geholt wenn sie gebraucht werden. Das spart Resourcen und Zeit.
Das funktioniert aber logischerweise nicht wenn ich das Pizza-Objekt per RMI zum Client übertragen habe.
Dort gibt es keine Hibernate-Instanz und dementsprechend keine Hibernate-Session die aber offensichtlich gebraucht wird um eine LazyLoading-Verknüpfung aufzulösen.
Hat jemand eine Ahnung wie es trotzdem funktioniert? Diese "Laden bei Bedarf"-Geschichte gefällt mir nämlich sehr gut.
Natürlich gibt es auch die Möglichkeit dafür zu sorgen, dass die Verknüpfung der Objekte statisch geschieht. Dann würde Hibernate immer wenn ein Pizza-Objekt geladen wird auch die Toppings mitladen. Dann funktioniert auch das übertragen per RMI problemlos.... aber irgendwie fühlt sich das an als würde das wichtigste Feature von Hibernate nicht genutzt werden
Vielleicht kennt ja jemand das Problem und hilft mir weiter.
Ich danke!
Gruß Sparrow