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.
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.
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.
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:
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.