Lesen Sie alles über EJB 2.0

Enterprise JavaBeans 2.0, veröffentlicht am 2. Juni, ist nicht nur eine Punktversion, sondern auch eine neue Version der Spezifikation. Mit etwas mehr als 500 Seiten ist die EJB 2.0-Spezifikation 200 Seiten (66 Prozent) länger als die vorherige EJB 1.1-Spezifikation. Die wichtigsten Änderungen in der Spezifikation betreffen die behältergesteuerte Persistenz (CMP) und die Einführung eines völlig neuen Bohnentyps, der MessageDrivenBean.

Der Großteil der Änderungen in EJB 2.0 findet sich in der Definition eines neuen CMP-Komponentenmodells. Es unterscheidet sich grundlegend vom alten CMP-Modell, da es einen völlig neuen Teilnehmer, den Persistenzmanager , und eine völlig neue Art der Definition von von Containern verwalteten Feldern sowie Beziehungen zu anderen Beans und abhängigen Objekten einführt .

Die Einführung der MessageDrivenBean(der Message Bean) ist ebenfalls von Bedeutung. Die Message Bean stellt die Integration von JMS (Java Message Service) in EJB dar, um einen völlig neuen Bean-Typ für asynchrone JMS-Nachrichten zu erstellen. Dieser aufregende neue Bean-Typ bietet ein Komponentenmodell für JMS-Clients, mit dem sie in der umfangreichen und robusten Umgebung eines EJB-Containersystems bereitgestellt werden können.

Es gibt viele andere kleinere Änderungen an der Spezifikation. Diese anderen Änderungen sind zwar wichtig, betreffen jedoch hauptsächlich die Verschärfung der Spezifikation, um Unklarheiten zu beseitigen und die Komponenten portabler zu machen. Dieser Artikel konzentriert sich auf die neuen CMP- und Message-Bean-Komponentenmodelle, die in EJB 2.0 eingeführt wurden.

Ich gebe einige konkrete Beispiele, daher sollte es ziemlich einfach sein, zu folgen und zu verstehen. EJB-Neulinge könnten das Material jedoch schwieriger finden, da davon ausgegangen wird, dass die Leser ein grundlegendes Verständnis von EJB haben. Weitere Informationen zu EJBs finden Sie unter Ressourcen.

Container-verwaltete Persistenz

Die von Containern verwaltete Persistenz hat in EJB 2.0 radikale Änderungen erfahren. In EJB 2.0 behandelt der Persistenzmanager die Persistenz von CMP-Entity-Beans zur Laufzeit automatisch. Der Persistenzmanager ist für die Zuordnung der Entity-Bean zur Datenbank auf der Grundlage eines neuen Bean-Persistenz-Manager-Vertrags verantwortlich, der als abstraktes Persistenzschema bezeichnet wird . Darüber hinaus ist der Persistenzmanager für die Implementierung und Ausführung von Suchmethoden verantwortlich, die auf einer neuen Abfragesprache namens EJB QL basieren .

Es ist wichtig zu beachten, dass Produkte, die der EJB 2.0-Spezifikation entsprechen, sowohl das EJB 1.1 CMP-Modell als auch das neue EJB 2.0-Modell unterstützen müssen. Obwohl diese Modelle nicht kompatibel sind, ist Unterstützung für das EJB 1.1-Modell erforderlich, um die Abwärtskompatibilität sicherzustellen.

Das abstrakte Persistenzschema

Um zu verstehen, wie das abstrakte Persistenzschema funktioniert und warum es wichtig ist, werde ich schnell überprüfen, wie CMP in EJB 1.1 behandelt wird, und anschließend erläutern, wie es in EJB 2.0 definiert ist.

Das EJB 1.1 CMP-Modell

In EJB 1.1 ist der Bean-Entwickler dafür verantwortlich, die persistenten Felder der Bean-Klasse entweder als primitiven Java-Typ oder als serialisierbaren Typ zu deklarieren. Die folgenden Beispiele zeigen eine EmployeeEnterprise-Bean-Klasse gemäß EJB 1.1 mit mehreren CMP-Feldern:

// Die öffentliche Klasse EmployeeBean EmployeeBean implementiert java.ejb.EntityBean {// Instanzfelder EntityContext ejbContext; // Container-verwaltete Felder public int identity; public String firstName; public String lastName; öffentliches Doppelgehalt; öffentliche Adresse Adresse; public Integer ejbCreate (int id, String fname, String lname) {identity = id; Vorname = fname; lastName = lname; return null; } ...} // Die adressabhängige Klasse public class Address implementiert Serializable {public String street; öffentliche String Stadt; öffentlicher String-Status; public String zip; }}

Wenn eine relationale Datenbank für die Persistenz verwendet wird, die primitiven Felder wie identity, firstName, lastNameund salarysind ziemlich einfach , da sie, wie schön zu SQL - Typen zuordnen beharren INTEGER, CHARund DOUBLE.

In EJB 1.1 enthält der XML-Bereitstellungsdeskriptor einer CMP-Bean cmp-fieldElemente zum Identifizieren der persistenten Felder (Container-verwaltete Felder) in der Bean-Klasse. Wie unten gezeigt, werden die cmp-fieldElemente verwendet, um zwischen den Feldern, die in die Datenbank geschrieben werden, und denen, die nicht in die Datenbank geschrieben sind, zu unterscheiden. Beispielsweise ist das ejbContextFeld nicht in der Liste der von Containern verwalteten Felder enthalten und daher kein dauerhaftes Feld.

   EmployeeEJB ... Container ... Identität Vorname Nachname Gehaltsadresse ... 

Der Containeranbieter stellt ein Tool zum Zuordnen der persistenten Felder der Bean zu den Spalten in den Datenbanktabellen bereit, normalerweise eine Tabelle pro Bean. Serialisierbare Typen wie Addresssind jedoch schwieriger beizubehalten. In EJB 1.1 gibt es keine Standardmethode zum Zuordnen serialisierbarer Objekte zu einer relationalen Datenbank. Obwohl die AddressKlasse über eigene Felder verfügt, bietet der XML-Bereitstellungsdeskriptor keinen Mechanismus zum Zuordnen dieser Felder zur Datenbank. In den meisten Fällen wurde erwartet, dass serialisierbare Objekte, wie sie als AddressBinärtyp, der manchmal als blobTyp bezeichnet wird, in einer Datenbanktabelle beibehalten werden.

Dieses Problem wird noch verschärft, da das Datenschema der Entity-Bean immer komplexer wird. Eine EmployeeBean kann beispielsweise viele untergeordnete Objekte haben, die ähnlich sind Address, wie z. B. Benefitsund JobPosition. Diese untergeordneten Objekte, die als abhängige Objekte bezeichnet werden, können komplexe Objektdiagramme bilden, die sich über mehrere Tabellen in einer relationalen Datenbank erstrecken. Darüber hinaus ist CMP in EJB 1.1 für unzureichende Beziehungen zu anderen Bohnen weitgehend unzureichend. Wenn in EJB 1.1 eine Bean eine Beziehung zu einer anderen Bean aufrechterhalten sollte, verwendet der Container automatisch den Primärschlüssel oder das Handle als Verknüpfung. Dies hat sich als ziemlich grober Mechanismus erwiesen, um Beziehungen zu anderen Bohnen aufrechtzuerhalten, deren natürliche Beziehung bidirektional sein kann oder von Feldern abhängt, die durch den Primärschlüssel oder das Handle nicht leicht dargestellt werden können.

Das EJB 2.0 CMP-Modell

In EJB 2.0 können Sie mit einem neuen Vertrag zwischen der CMP-Entity-Bean und dem Persistenzmanager komplexere und portablere Bean-to-Bean-, Bean-to-abhängige und sogar abhängige-zu-abhängige Objektbeziehungen innerhalb einer Entity-Bean definieren.

Der persistente Manager ist ein neuer Teilnehmer am Bereitstellungsprozess von Enterprise JavaBeans. Der Containeranbieter oder ein Anbieter, der sich auf die Persistenz für eine bestimmte Datenbank spezialisiert hat, kann den Persistenzmanager bereitstellen. Die Idee ist, den Mechanismus zum Verwalten von Bean-Beziehungen vom Container zu trennen, der für die Verwaltung von Sicherheit, Transaktionen und Ressourcen verantwortlich ist. Durch die Aufgabentrennung können verschiedene Persistenzmanager mit verschiedenen Containern arbeiten. Darüber hinaus können Entity-Beans sowohl für EJB-Anbieter als auch für Persistenzmanager portabler werden.

Wenn Sie mit CocoBase gearbeitet oder dieses studiert haben, einem Produkt von Thought Inc., das automatisch BMP-Beans (Bean Managed Persistence) für EJB 1.1-Container generiert, sind Sie bereits mit der Funktionsweise eines Tools für persistente Manager vertraut. CocoBase generiert die gesamte Datenbankzugriffslogik für BMP-Beans basierend auf den vom Bean-Bereitsteller bereitgestellten Objekt-zu-relationalen Zuordnungsinformationen. In EJB 2.0 kann der Persistenzmanager eine Zuordnung von CMP-Entitäten zu einer relationalen Datenbank basierend auf Informationen generieren, die vom Bereitstellungsdeskriptor, dem abstrakten Persistenzschema der Bean und der vom Bereitsteller ausgeführten Arbeit bereitgestellt werden. Der Persistenzmanager ist jedoch nicht auf eine relationale Datenbank beschränkt. Persistenzmanager können auch für Objektdatenbanken sowie Legacy- und ERP-Systeme wie SAP entwickelt werden.

Damit der Persistenzmanager vom Container getrennt werden konnte, musste ein Vertrag zwischen der Bean und dem Persistenzmanager definiert werden. Der Vertrag manifestiert sich im neuen abstrakten Persistenzschema. Dieses Schema wird durch einen neuen Satz von XML-Elementen im Bereitstellungsdeskriptor und einen Satz von Code-Idiomen in den CMP-Entity-Beans definiert. In EJB 2.0 wird die CMP-Bean-Klasse als abstrakt deklariert, und auf ihre persistenten Felder und Beziehungsfelder wird mithilfe von abstrakten Zugriffs- und Mutatormethoden zugegriffen, deren Methodensignaturen speziellen Elementen im XML-Bereitstellungsdeskriptor zugeordnet sind.

Wenn die Bean bereitgestellt wird, verwenden Sie persistente Manager-Tools, um eine konkrete Implementierung der abstrakten Bean-Klasse und ihrer abhängigen Objektklassen basierend auf dem XML-Bereitstellungsdeskriptor und der Bean-Klasse zu generieren. Die konkreten Implementierungen enthalten den Datenzugriffscode, der den Status der Bean zur Laufzeit tatsächlich liest und in die Datenbank schreibt. Zur Laufzeit verwendet der Container die von den Persistence Manager-Tools generierten Unterklassen anstelle der vom Bean-Anbieter definierten abstrakten Klassen.

Um der Diskussion etwas Fleisch zu geben, wird ein CMP-Entitätsbeispiel bereitgestellt, das konkreter erklärt, wie das abstrakte Persistenzschema funktioniert.

Eine beispielhafte CMP-Entität in EJB 2.0

In EJB 2.0 wird eine Container-verwaltete Entity-Bean als abstrakt definiert und ihre persistenten Felder werden nicht direkt in der Bean-Klasse definiert. Stattdessen wurde ein abstraktes persistentes Schema entwickelt, mit dem der Bean-Anbieter die persistenten Felder und Bean-Beziehungen indirekt deklarieren kann. Unten finden Sie ein Beispiel für die EmployeeBean, die das neue abstrakte persistente Schema verwendet. Beachten Sie, dass keines der persistenten Felder in der Bean-Klasse deklariert ist.

public abstract EmployeeBean implementiert javax.ejb.EntityBean {. // Instanzfelder EntityContext ejbContext; // Container-verwaltete persistente Felder public abstract void setIdentity (int identity); public abstract int getIdentity (); public abstract void setFirstName (String firstName); public abstract String getFirstName (); public abstract void setLastName (String lastName); public abstract String getLastName (); // Container-verwaltete Beziehungsfelder public abstract void setContactInfo (ContactInfo info); public abstract ContactInfo getContactInfo (); ...}

Im XML-Bereitstellungsdeskriptor dieser Bean deklariert das abstrakte Persistenzschema die vom Container verwalteten Felder und Beziehungen.

   EmployeeEJB ... Container ... Identität Vorname Nachname ... ContactInfo ContactInfo Straße Stadt Bundesland Postleitzahl homePhone workPhone E-Mail ... Employee-ContactInfo Mitarbeiter-hat-Kontaktinfo ein EmployeeEJB contactInfo ContactInfo contactinfo_belongsto_employee one ContactInfo