Erstellung von EJB Relationship (CMP)

macfreakz

Mitglied
Hallo,

bin zum ersten Mal hier
und das Forum hört sich ganz gut an ...
bin schon gespannt auf eure Antworten ...

Wie ich gelesen habe, muss man Lokales Interface benutzen, damit die Beziehungen zwischen zwei Tabellen funktionieren.

Mein Problem ist: der Client darf neue Datensätze anlegen und auch die Datensätze ändern bzw. löschen.

D.h. folgende Klassen müssen erstellt werden:

ClientBean
ClientRemote
ClientRemoteHome

KundeBean
KundeLocal
KundeLocalHome

AdresseBean
AdresseLocal
AdresseLocalHome

Die Klasse ClientRemote stellt dem Client zur Verfügung,
und es ist also auszugehen, dass ich auch extra für
jede Aktionen wie create, update, delete, ... im
ClientBean, ClientRemote und ClientRemoteHome erstellen muss,
damit der Client diese Methoden aufrufen kann.

Ich finde, das ist reine Aufwand und denke
auch, dass es andere Lösung gibt ...
ich bin auch "einverstanden", wenn die Klasse KundeLocal
direkt zugegriffen wird, jedoch gehts nur über KundeRemote,
aber was dann zu einem Beziehungsproblem führt.

Lösungsansätze im Internet habe ich nicht gefunden.
googeln war keine Hilfe ...

danke für Eure Hilfe ! ;)
 
Hallo!

Weshalb gehst du nicht so vor, dass du beispielsweise eine Stateless SessionBean Remote verfügbar machst welche dann wiederum entweder direkt mit den Localen Entity Beans bzw. über ein Business Delegate interagiert. Weiterhin sind Value Objects und Codegeneratoren a la XDoclet eine große Hilfe ;-)

Gruß Tom
 
Danke für die Antwort.

Solches Gedanken habe ich mir auch gemacht und
frage mich auch, ob es wirklich "richtig" ist.

ClientBean u. ClientRemote sollen also
diese Methoden enthalten:

Code:
public KundeLocal getKunde();
public AdresseLocal getAdresse();

D.h. ich muss die Lokale Klassen auch dem Client zur Verfügung stellen.
Vom Logik her gesehen ist die Trennung von Remote und Lokal "zerstört" oder?
 
Hallo!

Genau dafür gibts ja die ValueObjects ;-)
Value Objects sind nun mal das Mittel der Wahl wenn Daten von der Server Anwendung auf dem Client verfügbar gemacht werden sollen.
Du hättest dann für jede EntityBean ein bzw. mehrere ValueObject(s). (Mehrere, da man unterschiedliche Detailierungsgrade modellieren kann). Die kannst du dann beispielsweise zum Client schicken und dieser kann jene dann zum Anzeigen von Daten verwenden.
Weiterhin kannst du auch auf dem Client ValueObjects befüllen und dann Methoden (Stateless Session Bean) übergeben welche dann auf dem Server eine "Übersetzung" in EntityBeans vornimmt (Beispielsweise eine neue EntityBean anlegt deren Felder passend zu den Werten eines ValueObjects gefüllt werden und das ganze in die Datenbank schreibt).

Gruß Tom
 
das mit ValueObjects hört sich ganz gut an!

Freu mich, dass es dieses Forum gibt.

Gibts Beispiele wie ich ein ValueObject definieren kann,
ohne dass XDoclet verwendet wird?
 
gut so! Ich bin so weit gekommen, bis auf diese Fehlermeldung:

Code:
java.lang.reflect.UndeclaredThrowableException
	at $Proxy1.getAllKunden(Unknown Source)
	at de.bayern.shbam2.personalverwaltung.test.TestEJB.main(TestEJB.java:47)
Caused by: java.lang.ClassNotFoundException: org.jboss.ejb.plugins.local.EntityProxy (no security manager: RMI class loader disabled)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:371)
	at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
	at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
	at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)
	at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:200)
	at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)
	at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
	at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1845)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1769)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
	at java.util.ArrayList.readObject(ArrayList.java:547)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	at java.lang.reflect.Method.invoke(Method.java:324)
	at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:838)
	at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1746)
	at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1646)
	at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
	at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
	at java.rmi.MarshalledObject.get(MarshalledObject.java:135)
	at org.jboss.invocation.jrmp.interfaces.JRMPInvokerProxy.invoke(JRMPInvokerProxy.java:119)
	at org.jboss.invocation.InvokerInterceptor.invokeInvoker(InvokerInterceptor.java:163)
	at org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:103)
	at org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:46)
	at org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:55)
	at org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:97)
	at org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:91)
	... 2 more

Die Methode getAllKunden() ist in der Klasse ClientBean u. ClientRemote definiert, was eigentlich in Ordnung ist.

Woran kann diese Fehler liegen?
Hat jemand ne Idee?

Danke!
 
Ach, war etwas zu voreilig ;-)

das Problem wurde gelöst, indem ich die Rückgabewert (Collection) mit AdresseVO gefüllt habe - vorhin war es AdresseLocal, was zu dieser Fehlermeldung geführt hat -

vielen dank für Eure nette Unterstützung!

Bis später wieder, veilleicht ;-)
 
Trotzdem funktioniert die Erstellung von einer Beziehung zwischen zwei Tabellen nicht.

Code:
Tabelle Kunde
ID
nachname
vorname

Tabelle Adresse
ID
kFK
anschrift

Datenbank: MySQL

Kann jemand mir ein kleines Beispiel machen?
Habe 2 Tage herumprobiert. ... naja!

Danke erstmal!
 
Yeah! Es klappt jetzt.
Gibt nicht, es sei denn: nachdem ich hier mein problem erläutet habe,
funktioniert es ... aber zum zweiten Mal (siehe oben)

das Problem war: EJB konnte nicht an Spaltennamen erkennen, ob
der Spalte einen Bezug auf die Master-Tabelle hat.

Daher ist es notwendig, die richtigen Spaltennamen zu vergeben:

Code:
Tabelle Kunde
kundeID
nachname
vorname

Tabelle Adresse
adresseID
kundeID
anschrift

das wars! ;-)
 

Neue Beiträge

Zurück