Entity Beans - Vererbung

asd42

Grünschnabel
Hallo,
ich beschäftige mich erst seit kurzem mit Java Enterprise und bin gerade dabei eine Anwendung zu designen.
Dabei ergab sich folgendes Problem: Ich entwickle ein verteiltes System. In diesem gibt es ein Objektmodell, auf dessen Grundlage alle verschiedenen Clients und der Server arbeiten sollen. Jetzt würde ich gern aus meinen normalen Java-Klassen Entity Classes ableiten, ohne dass die Oberklassen Annotations verwenden müssen. Gibt es eine Möglichkeit dies zu tun ohne dass ich meine Entity-Deklaration in XML durchführen muss? würde schon gern auf dem Server bei Annotations bleiben.
Bitte schlagt mich nicht und http://www.gidf.de kenne ich auch schon ;)
Schon mal vielen Dank...
 
Mehrere Sachen:

1. ein Client Server System wid nicht gleich zu einem verteilten System. Zwar kann läuft logischerweise ein RichClient auf einer anderen Maschine als der Server, allerdings ist der Begriff "verteiltes System" eher dann im Umlauf, wenn serverseitig eine Verteilung auf verschiedene Maschinen angestrebt wird. Man beachte allerdings Martin Fowler's first rule of disributed objects: "Don't do it!" ;).

2. Ich vermute aus deinem Post zwei Sachen herauslesen zu können: du benutzt EJB3 bzw. JPA. Zum anderen sollte es sich im ein Serversystem handeln, dass im ganzen auf einer Maschine landet und einem oder mehreren Clients (evtl. in der gleichen Maschine - Webfrontend oder entfernt - evtl. RichClient, WebServices o.ä)

Wenn das der Fall ist, bist du schlecht damit beraten, das Domänenmodell 1:1 an Clients rauszureichen, also mit den gleichen Klassen zu arbeiten. Viele JPA PersistenceProvider wie Hibernate arbeiten mit LazyLoading, was bei entfernten Clients einfach nicht tut. Zum anderen benötigen verschiedene Clients auch völlig unterschiedliche Sichten auf ein Domänenobjekt bzw. nur einen kleinen Ausschnitt davon. Wenn du da jedes mal das ganze Objekt über die Leitung schickst, geht schnell die Performance in die Knie.

Mein Ratschlag also dahingehend: solang du nur ein Webfrontend bedienst, was in der gleichen Maschine läuft, kannst du bequem mit dem serverseitigen Modell arbeiten. Für entfernte Clients würde ich aber DTOs einführen bzw. pro Client Interfaces definieren, die dann serverseitig mit einem oder mehreren DTOs implementiert werden können. Das sorgt dann auch dafür, dass eine Schnittstellenänderung in Client A nicht unbedingt Änderungsaufwand in Client B nach sich zieht. Patterns, die du dir dafür anschauen könntest sind DTO, DTO Assembler (aus Martin Fowler's Patterns of Enterprise Application) und Aggregate (aus Eric Evans' Domain Driven Design)

So, und nun zum Thema ;). Ich würde für so eine Anwendung das Domänenmodell direkt mit JPA Annotationen versehen und diese Objekte dann entsprechend für verschiedene Clients aufbereiten. Ein Vererbungsbeziehung nur für ein technisches Artefakt einzuführen halte ich nicht für gut.

Ale Klarheiten beseitigt?

Gruß
Ollie
 
Zurück