Beispiel: N:M-Beziehung Container Managed


Beispiel für zwei container managed Entity Beans, die in einer container managed n:m-Beziehung stehen. Auf die Beans wird per Webclient zugegriffen wird.

Aufbau des Beispieles


Es gibt zwei Entity-Beans "Wort" und "Buchstabe". Ein Wort besteht aus 1 bis n einzelnen Buchstaben. Jeder vorhanden Buchstabe wird durch die Entity Bean "Buchstabe" abgebildet, wobei jeder Buchstabe nur einmal in der Datenbank vorhanden sein soll. Jedes Wort ist mit allen Buchstaben verknüpft, die darin vorkommen. Die Buchstaben sind mit allen Worten verknüpft, in denen sie vorkommen.
Die n:m-Beziehung wird also hauptsächlich durch das Bearbeiten der Worte modifiziert. Die Buchstaben werden automatisch verwaltet.


Bestandteile:
a) Entity-Bean-Klasse für ein Objekt "Wort" mit Local-Interfaces.
a) Entity-Bean-Klasse für ein Objekt "Buchstabe" mit Local-Interfaces.
c) Web Client.


Deploy der Entity Bean "Wort"

Die benötigten Dateien sollten mittlerweile keinen Screenshot mehr erfordern.
Schritt 3: Auswählen der persistenten Datenbankfelder.
Nur das Feld "Wort" soll vom Container verwaltet werden (nicht aber "Buchstaben", die Collection der Buchstaben des Worts). Der Primary Key wird vom Container erzeugt.
Wort Bean (Schritt 3)
Schritt 3a: Von Schritt 3 aus Deklarieren der Finder.
Die Query für "findAll" sieht so aus:
select Object(w) from WortBean w order by w.wort
Die Query für "findByWort" (prüfen, ob ein Wort bereits vorhanden ist, um Duplikate zu vermeiden) sieht so aus:
select Object(w) from WortBean w where w.wort = ?1
(das zu ladende Wort ist der erste Parameter der Methode).
Diese Methode wäre wahrscheinlich geschickter als Select-Methode deklariert.
Nachbearbeitung:
Nach dem Anlegen der Bean müssen die Datenbankfeld-Informationen erzeugt werden

Deploy der Entity Bean "Buchstabe"

Schritt 3: Auswählen der persistenten Datenbankfelder.
Das Feld "Buchstabe" sollen vom Container verwaltet werden (nicht aber "Worte", die Referenz auf die Worte, in denen der Buchstabe vorkommt). Der Primary Key wird automatisch vom Container erzeugt.
Buchstabe Bean (Schritt 3)
Die finder ähneln denen aus dem letzten Beispiel:
"findAll":
select Object(b) from BuchstabeBean b order by b.buchstabe
"findByBuchstabe" (prüfen, ob ein Buchstabe bereits vorhanden ist, um Duplikate zu vermeiden):
select Object(b) from BuchstabeBean b where b.buchstabe = ?1

Nachbearbeitung:
Nach dem Anlegen der Bean müssen die Datenbankfeld-Informationen erzeugt werden

Erstellen der Container managed relationship

as Bean-JAR auswählen und auf den Karteireiter "Relationships" wechseln. Dort auf "Add" klicken.
Eine "Many-to-Many"-Relationship hinzufügen, wobei als Bean A die WortBean gewählt wird, auf der anderen Seite steht die BuchstabeBean. Die WortBean wird über das Feld "Buchstaben" mit einer Collection von n Buchstaben verknüpft. Umgekehrt erhält man durch Abrufen der Property "Worte" der BuchstabenBean eine Collection von WortBeans.
Relationships erzeugen

Deploy des Web Clients

Das Vorgehen ist mittlerweile bekannt.
-JSP-Dateien und Local Interfaces der Beans zufügen
-EJB-Referenzen "ejb/Wort" und "ejb/Buchstabe" deklarieren
-Context Root auf "nm" setzen
Erreichbar ist der Webclient unter http://localhost:8080/nm (keine Angabe einer JSP-Seite nötig, da die Hauptseite "index.jsp" heißt und deshalb direkt angezeigt wird).

Erzeugte Datenbanktabellen

Im Pointbase-Tool sehen die erzeugten Datenbanktabellen so aus:
Datenbank
Zusätzlich zu den beiden Tabellen der Entity-Beans wurde eine n:m-Mapping-Tabelle erzeugt, die nur zwei Spalten mit den Foreign Keys der verknüpften Objekte enthält.