Beispiel: Container Managed Relationships mit Container-Generated Primary Keys
Beispiel für zwei Container Managed Entity Beans, die in einer Container Managed Relationship (CRM) stehen,
und auf die per Webclient zugegriffen wird. Im Unterschied zum letzten Beispiel werden die Primary Keys
hier vom Container erzeugt.
Aufbau des Beispieles
Mittels einer Entity Bean werden Objekte vom Typ "KuchenAutoPK" abgebildet (der Namenszusatz "AutoPK" ist
gewählt damit diese Bean von der Bean "Kuchen" aus dem letzten Beispiel unterschieden werden kann, so dass
es keine Überschneidungen gibt wenn beide Projekte im gleichen Container deployed werden).
Ein Kuchen besteht nur aus der Property "Name". Der Unique Key der Bean wird in diesem Beispiel vom
Container verwaltet.
Mittels einer zweiten Entity Bean werden Objekte vom Typ "KuchenZutatAutoPK" abgebildet. Ein Kuchen besteht aus 0 bis n Zutaten.
Eine Zutat besteht aus den Properties "Name" und "Menge". Der Unique Key der Bean wird vom Container
erzeugt.
Da die Relationship vom Container verwaltet wird, müssen beide Beans im selben
Container laufen, d.h. Zugriff kann nur über Local-Interfaces erfolgen.
Bestandteile:
a) Entity-Bean-Klasse für ein Objekt "KuchenAutoPK" mit Local-Interfaces.
a) Entity-Bean-Klasse für ein Objekt "ZutatAutoPK" mit Local-Interfaces.
c) Web Client.
Inhalt:
Deploy der Entity Bean "KuchenAutoPK"
Deploy der Entity Bean "ZutatAutoPK"
Erstellen der Container managed relationship
Deploy des Web Clients
Quellcode
In diesem Beispiel wird ein Dynamic Web Project namens "KuchenZutatAutoPK" verwendet.
Hier gibt es den Code als Export (siehe Anleitung zum Importieren eines Java Projects) KuchenZutatAutoPKExport.zip.
Hier steckt die EAR-Datei des Deploytools: KuchenZutatAutoPK.ear
Deploy der Entity Bean "KuchenAutoPK"
Schritt 1: Einstellungen siehe Screenshot.
Zu beachten: auch die Dateien der Zutat-Bean werden dem JAR zugefügt.
Schritt 2: Bean-Klasse sowie die Local-Interfaces auswählen.
Schritt 3: Auswählen der persistenten Datenbankfelder.
Nur das Feld "Name" soll vom Container verwaltet werden (NICHT aber "Zutaten", die Collection der Zutaten).
Der Primary Key wird vom Container erzeugt.
Schritt 3a: Von Schritt 3 aus Deklarieren der Finder.
Diese Anwendung enthält neben der "findAll"-Methode ohne weitere WHERE-Bedingungen eine Select-Methode.
Die Query für "findAll" sieht so aus:
select Object(k) from KuchenAutoPKBean k order by k.name
Es gibt keine ejbSelect-Methode wie im vorherigen Beispiel, da der Primary Key vom Container verwaltet wird.
Nachbearbeitung:
Nach dem Anlegen der Bean MÜSSEN die Datenbankfeld-Informationen erzeugt werden (siehe Anleitung beim vorherigen Beispiel).
Das Ergebnis sollte so aussehen:
Deploy der Entity Bean "ZutatAutoPK"
Schritt 1: Dem bestehenden JAR wird eine weitere Bean zugefügt, d.h. es sind keine weiteren Klassen zuzufügen.
Schritt 2: Bean-Klasse sowie die Local-Interfaces auswählen.
Schritt 3: Auswählen der persistenten Datenbankfelder.
Die Felder "ZutatName" und "Menge" sollen vom Container verwaltet werden (NICHT aber "Kuchen", die Referenz auf den Kuchen,
zu dem die Zutat gehört).
Der Primary Key wird automatisch vom Container erzeugt.
Diese Bean hat keine Finder und keine ejbSelect-Methoden.
Nachbearbeitung:
Nach dem Anlegen der Bean MÜSSEN die Datenbankfeld-Informationen erzeugt werden (siehe Anleitung beim vorherigen Beispiel).
Das Ergebnis sollte so aussehen:
Erstellen der Container managed relationship
Das Bean-JAR auswählen und auf den Karteireiter "Relationships" wechseln. Dort auf "Add" klicken.
Eine "One-to-Many"-Relationship hinzufügen, wobei als Bean A die KuchenAutoPKBean gewählt wird, auf der "Many"-Seite steht die
ZutatBean. Die KuchenBean wird über das Feld "zutaten" mit einer Collection von n ZutatBeans verknüpft. Umgekehrt erhält
man durch Abrufen der Property "kuchen" der ZutatBean eine KuchenBean.
Beim Löschen eines Kuchens sollen alle Zutaten gelöscht werden.
Anschließend DatabaseMappings der beiden Beans neu erzeugen. Es fällt auf, dass jetzt die Felder für die
Relationship ebenfalls auftauchen.
Deploy des Web Clients
Es wird hier ein Webclient verwendet, da die beiden Beans wegen der Relationship im gleichen Container laufen müssen und
deshalb kein Client mittels Remote-Interfaces auf diese Beans zugreifen darf. (Eine Lösung wäre hier eine Session-Bean als
Fassade für den Zugriff).
Schritt 1: Hinzufügen der JSP-Seiten und der Local-Interfaces.
Anschließend hinzufügen der vier JSPs.
Nachbearbeitung:
Festlegen der Context-Root: kuchenzutatautopk
Folgende EJB-Referenzen hinzufügen:
"ejb/KuchenAutoPK" referenziert "com.knauf.ejb.kuchenzutatautopk.LocalKuchenAutoPKHome" und "com.knauf.ejb.kuchenzutatautopk.LocalKuchenAutoPK".
"ejb/ZutatAutoPK" referenziert "com.knauf.ejb.kuchenzutatautopk.LocalZutatAutoPKHome" und "com.knauf.ejb.kuchenzutatautopk.LocalZutatAutoPK".
Erzeugte Datenbanktabellen
Im Pointbase-Tool sehen die erzeugten Datenbanktabellen so aus:
Man erkennt die Primary Keys und das vom Container automatisch erzeugte Foreign-Key-Feld, mit dem die KuchenBean-Tabelle referenziert wird.
Version 1.0.0.0, Stand 30.10.2005
Historie:
1.0.0.0 (30.10.2005): Erstellt