Beispiel: Bean Managed Persistence (JBoss 4.0)
Inhalt:
Anlegen der Application
Anlegen der Entity Bean "KuchenBMP"
Anlegen der Entity-Bean "ZutatBMP"
Definition der Datenbank
Anlegen des Webclients
Beispiel für zwei Entity Beans mit Bean Managed Persistence, die in einer (ebenfalls
bean managed) 1:n-Beziehung stehen. Auf die Beans wird per Webclient zugegriffen wird.
Die Deployanleitung bezieht sich auf JBoss 4.0.3.
Hier gibt es das Projekt zum Download (dies ist ein EAR-Export, die Importanleitung findet
man im Stateless-Beispiel): KuchenZutatBMP.ear
ACHTUNG: Nach dem Import XDoclet-Builder im EJB-Projekt aktivieren ! (Das Web-Projekt
verfügt über keine Servlets, deshalb kann WebDoclet dort nicht verwendet werden)
Aufbau des Beispieles
a) Entity Bean-Klasse für Kuchen mit Local-Interfaces.
b) Entity Bean-Klasse für Zutat mit Local-Interfaces.
c) Webclient
Anlegen der Application
Ein "EAR Application Project" mit dem Namen "KuchenZutatBMP" erstellen.
Zu erzeugende Module definieren. Dieses Beispiel benötigt ein EJB-Projekt und
ein Anwendungsclientprojekt.
Anlegen der Entity Bean "KuchenBMP"
Wir legen eine Session Bean namens "KuchenBMPBean" im Package de.fhw.swtvertiefung.knauf.kuchenzutatbmp
an.
Im letzten Schritt ändern wir das zu implementierende Interface von "javax.ejb.SessionBean"
auf "javax.ejb.EntityBean".
Den Rest der Arbeit müssen wir in der Bean-Klasse und mittels XDoclet erledigen.
Anlegen der Entity-Bean "ZutatBMP"
Diese Bean kopieren wir am besten aus "KuchenBMPBean" und ersetzen überall "KuchenBMP" durch "ZutatBMP".
Wenn wir das Kopieren innerhalb des Project Explorer durchführen ("KuchenBMPBean"
wählen -> Copy -> Paste im Package de.fhw.swtvertiefung.knauf.kuchenzutatbmp
, dann fordert Eclipse
uns zur Eingabe eines neuen Namens auf und ersetzt auch den Klassennamen im Code.
Die Property "name" in "zutatName" ändern.
Es wird ein Feld "Menge" vom Typ java.lang.String
zugefügt.
Die Methode "ejbCreateByName" wird ersetzt durch "ejbCreateByNameMenge".
Eine Referenz zu KuchenBMP wird zugefügt.
Ab diesem Zeitpunkt erzeugt XDoclet Warnmeldungen bei einem Compilelauf, da die beiden Beans sich gegenseitig
referenzieren und XDoclet naturgemäß bei Erzeugen der KuchenBMPBean die EJB-Referenz auf ZutatBMPBean nicht auflösen
kann. Deshalb anschließend einen zweiten Build-Lauf durchführen.
Datenbank-Resource
In der XDoclet-Deklaration von KuchenBMPBean und ZutatBMPBean wird folgendes zugefügt:
* @ejb.resource-ref
* res-ref-name="jdbc/KuchenZutatBMPDB"
* res-type="javax.sql.DataSource"
* res-auth="Container"
* @jboss.resource-ref
* res-ref-name="jdbc/KuchenZutatBMPDB"
* jndi-name="java:/DefaultDS"
Es wird eine Resourcen-Referenz namens "jdbc/KuchenZutatBMPDB" angelegt (beim JNDI-Lookup zu finden
unter "java:comp/env/ejb/jdbc/KuchenZutatBMPDB").
Diese wird verknüpft mit der bereits im Server vorhandenen Datenquelle "DefaultDS" (im JNDI unter "java:DefaultDS" zu finden).
Die Deklaration dieser Datenquelle erfolgt übrigens in der Datei "hsqldb-ds.xml" in "JBOSS_HOME\server\default\deploy". Hier
ein Auszug:
<datasources>
<local-tx-datasource>
<!-- The jndi name of the DataSource, it is prefixed with java:/ -->
<!-- Datasources are not available outside the virtual machine -->
<jndi-name>DefaultDS</jndi-name>
...
</local-tx-datasource>
</datasources>
Datenbank erzeugen
Im Hypersonic Datenbankmanager folgende Befehle ausführen:
CREATE TABLE KUCHENBMPBEAN
(
kuchenid INTEGER NOT NULL,
name VARCHAR ( 256),
CONSTRAINT KuchenBMPBean_PK PRIMARY KEY ( kuchenid)
);
CREATE TABLE ZUTATBMPBEAN
(
ZutatId INTEGER NOT NULL,
ZutatName VARCHAR ( 256),
Menge VARCHAR ( 256),
KuchenID INTEGER NOT NULL,
CONSTRAINT ZutatBMPBean_PK PRIMARY KEY ( ZutatId),
CONSTRAINT ZutatBMPBean_FK1 FOREIGN KEY ( KuchenID) REFERENCES KUCHENBMPBEAN( KUCHENID)
);
Anlegen des Webclients
Der Webclient muss die EJB-JARs referenzieren. Dazu in die Eigenschaften des Webmoduls "KuchenZutatBMPWeb"
wechseln und unter "J2EE Module Depdencies" das EJB-JAR wählen.
EJB-Verweise festlegen:
Da wir hier kein Servlet verwenden können wir uns den EJB-Verweis nicht per XDoclet generieren lassen.
Also in "Dynamic Web Projects" -> "KuchenZutatBMPWeb" -> "WebContent" -> "WEB-INF" -> "web.xml" gehen und
folgendes einfügen:
<ejb-local-ref>
<ejb-ref-name>ejb/ZutatBMP</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>de.fhw.swtvertiefung.knauf.kuchenzutatbmp.ZutatBMPLocalHome</local-home>
<local>de.fhw.swtvertiefung.knauf.kuchenzutatbmp.ZutatBMPLocal</local>
<ejb-link>ZutatBMP</ejb-link>
</ejb-local-ref>
<ejb-local-ref>
<ejb-ref-name>ejb/KuchenBMP</ejb-ref-name>
<ejb-ref-type>Entity</ejb-ref-type>
<local-home>de.fhw.swtvertiefung.knauf.kuchenzutatbmp.KuchenBMPLocalHome</local-home>
<local>de.fhw.swtvertiefung.knauf.kuchenzutatbmp.KuchenBMPLocal</local>
<ejb-link>KuchenBMP</ejb-link>
</ejb-local-ref>
Es müssen vier JSP-Seiten "Kuchen.jsp", "KuchenEdit.jsp", "KuchenZutaten.jsp", "KuchenZutatEdit.jsp" zugefügt werden.
Jetzt die Anwendung nur noch deployen. Sie ist unter
http://localhost:8080/KuchenZutatBMPWeb/Kuchen.jsp zu erreichen.
In der Datenbank sieht alles genauso aus wie im "KuchenZutat"-Beispiel, deshalb keine weiteren Screenshots.
Version 1.0.0.1, Stand 24.11.2005
Historie:
1.0.0.0 (14.11.2005): Erstellt
1.0.0.1 (24.11.2005): Ein übersehenes TODO entfernt, Kommentar zur Notwendigkeit von "getZutatenListe".