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.
Erzeugen einer Application (Module)


Anlegen der Entity Bean "KuchenBMP"

Wir legen eine Session Bean namens "KuchenBMPBean" im Package de.fhw.swtvertiefung.knauf.kuchenzutatbmp an.
Kuchen Bean (1)
Im letzten Schritt ändern wir das zu implementierende Interface von "javax.ejb.SessionBean" auf "javax.ejb.EntityBean".
Kuchen Bean (2)


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-Dependencies
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".