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 "Kuchen" abgebildet. 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.

Besonderheit dieses Beispiels: 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 "Kuchen" mit Local-Interfaces.
a) Entity-Bean-Klasse für ein Objekt "Zutat" mit Local-Interfaces.
c) Web Client.


Deploy der Entity Bean "KuchenAutoPK"

Schritt 1: Einstellungen siehe Screenshot.
Kuchen Bean (Schritt 1)
Zu beachten: auch die Dateien der Zutat-Bean werden dem JAR zugefügt.
Schritt 2: Bean-Klasse sowie die Local-Interfaces auswählen.
Kuchen Bean (Schritt 2)
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.
Kuchen Bean (Schritt 3)
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.
Kuchen Bean (Finder)

Nachbearbeitung:
Nach dem Anlegen der Bean MÜSSEN die Datenbankfeld-Informationen erzeugt werden (siehe Anleitung beim vorherigen Beispiel). Das Ergebnis sollte so aussehen:
Kuchen Bean (Database Mappings)

Deploy der Entity Bean "KuchenZutatAutoPK"

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.
Zutat Bean (Schritt 2)
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.
Zutat Bean (Schritt 3)
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:
Zutat Bean (Database Mappings)


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.
Relationships erzeugen

ACHTUNG: Bei mir kam es bei dieser Reihenfolge (erzeugen der DatabaseMappings, dann zufügen der Relationship) zu folgendem Fehler im Serverlog:
While deploying 'ejb-jar-ic' from 'KuchenZutatAutoPK': sun-cmp-mappings.xml exists but has invalid contents: sizeColumnPair() == 0

Umgehung: DatabaseMappings der beiden Beans neu erzeugen. Es fällt auf, dass jetzt die Felder für die Relationship ebenfalls auftauchen.
Kuchen Bean (Database Mappings, 2. Versuch)

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.
Deploy des Web Clients
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:
Datenbank
Man erkennt die Primary Keys und das vom Container automatisch erzeugte Foreign-Key-Feld, mit dem die KuchenBean-Tabelle referenziert wird.