Enterprise JavaBeans 3.0

Ähnliche Dokumente
EJB 3.0 alles wird einfacher. Stephan Metzler, eurolink SWITZERLAND

Hurra, es ist ein POJO

Enterprise JavaBeans -

EJB 3 und MDSD. geht da was? Präsentation SE2007-Konferenz (Workshop Model Driven Software Development Today), Hamburg,

OR-Mapping. WS2008/2009 DBIS/Dr. Karsten Tolle

Enterprise JavaBeans Überblick

4.2 Workshop EJB. Entwicklung von EJB-Anwendungen

Java Persistence API. Phillip Ghadir Oliver Tigges

J2EE-Praktikum. Enterprise JavaBeans Patterns. Peter Thiemann. J2EE-Praktikum, WS2005/2006. Universität Freiburg

Teil I Grundlagen. Oliver Ihns / Stefan M. Heldt / Holger Koschek / Joachim Ehm, EJB 3.1 professionell, dpunkt.verlag, ISBN

5.2 Workshop EJB. Entwicklung von EJB-Anwendungen. Das JOnAS-System

Enterprise JavaBeans Überblick

typisiert, vom Compiler prüfbar, gute IDE-Unterstützung

11. Enterprise Java Beans Grundlagen der Programmierung II (Java)

Der lokale und verteilte Fall

16 Migration von EJB 2.x nach 3.0

Übungsaufgabe Transaktion als Middleware

Enterprise JavaBeans Überblick

J2EEKurs. Enterprise JavaBeans Einführung. Peter Thiemann. Sommercampus J2EEKurs, Freiburg, Germany, Universität Freiburg, Germany

Enterprise JavaBeans Überblick

Geschäftskomponenten mit EJB 3.1

Enterprise JavaBeans (mit JBoss)

Softwareentwicklung mit Enterprise JAVA Beans

Enterprise Java Beans (EJB)

AVID Übung 3. Enterprise JavaBeans. Andreas I. Schmied SS2005. Abteilung Verteilte Systeme Universität Ulm

Session Beans & Servlet Integration. Ralf Gitzel

Zwischenbericht Großer Beleg

Richard Oates Thomas Langer Stefan Wille Torsten Lueckow Gerald Bachlmayr. Spring & Hibernate. Eine praxisbezogene Einführung HANSER

EJB 3 - Erfahrungen aus der Praxis. Heiko W. Rupp

Softwareentwicklung mit Enterprise JAVA Beans

Enterprise Java Beans

Client/Server-Programmierung WS2007/08. EJB/JSP: Schritt-für-Schritt Anleitung

Datenzugriffskomponente mit JPA 2.1

Enterprise JavaBeans Überblick

Persistenz unter Kontrolle mit JDBI für Java

Projektgruppe. Thomas Kühne. Komponentenbasiertes Software Engineering mit OSGi

FWP Aktuelle Technologien zur Entwicklung verteilter Java-Anwendungen

D.97 D.98 D.100 D XDoclet (3) 11.1 XDoclet (2) 11.2 Exkurs: Java Annotations 12 EJB 3.0. Vorteile

Spring & Hibernate HANSER. Eine praxisbezogene Einführung. Richard Oates Thomas Langer Stefan Wille Torsten Lueckow Gerald Bachlmayr

Datenbankpraktikum, Gruppe F. JPA mit Hibernate. Alexander Stautner, Harald Zauner, Sascha Schreier

EJB 3 - Ein Blick über den Tellerrand. Heiko W. Rupp <hwr@pilhuhn.de>

Enterprise Java Beans

Enterprise JavaBeans Überblick: 8. Test-Driven Development. 8.1 Einleitung 8.2 Beispiel 8.3 Anwendung mit Eclipse und dem JBoss Application Server

Oliver Ihns, Dierk Harbeck, Stefan M. Heldt, Holger Koschek. EJB 3 professionell

Spring & Hibernate Eine praxisbezogene Einführung

EJB jar.xml und Name Service (JNDI)

Warum EJB Technologie (1)?

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Enterprise JavaBeans Überblick: 12. Session Facade Einleitung 12.2 Problem 12.3 Lösung. Prof. Dr. Björn Dreher Liste V Enterprise JavaBeans 460

Architekturen für verteilte Internetdienste

Workshop Java Webentwicklung Einführung in Hibernate. Ulrich Stärk

Enterprise JavaBeans Überblick: 10. Queries Interface Query 10.2 EJB Query Language 10.3 Named Queries

Geschäftskomponenten mit EJBs

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

12 Abstrakte Klassen, finale Klassen und Interfaces

Ndo 3. Aufbruch zu neuen Ufern Migration bestehender J2EE Anwendungen. Jens Schumann

AVID-Übung 3. EJB mit JBoss und Eclipse. 17. Juni Andreas I. Schmied Abteilung Verteilte Systeme Projektgruppe AspectIX

Enterprise JavaBeans Überblick

1 Einleitung Jetzt wird s leicht! 9

Application Server Application Server: Motivation Application Server: Begriff

Remote Method Invocation

Java-Persistenz-Architekturen. Freiberuflicher Entwickler und Autor. DOAG Konferenz 1.12.

Einstieg in die Informatik mit Java

Inhaltsverzeichnis. Bernd Müller, Harald Wehr. Java Persistence API 2. Hibernate, EclipseLink, OpenJPA und Erweiterungen ISBN:

Freundliche Eindringlinge. Moderne Web- Applika1onen mit CDI

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

OO Programmiersprache vs relationales Model. DBIS/Dr. Karsten Tolle

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Informationsintegration und Web-Portale. Tutorial: Enterprise Java Beans. Erik Buchmann

Zweck: sequentieller Zugriff auf Elemente eines Aggregats. mehrere Abarbeitungen des Aggregatinhalts

Hibernate. Persistenz in Java-Systemen mit Hibernate und der Java Persistence API. dpunkt.verlag

Zweck: sequentieller Zugriff auf Elemente eines Aggregats

Application Frameworks

Programmieren in Java -Eingangstest-

Die Magie von MBeans und JMX. DOAG 2014 Andreas Chatziantoniou - Foxglove-IT BV

Systemprogrammierung. Projekt: Java RMI. Wintersemester 2006 / 2007

Vorkurs Informatik WiSe 15/16

Zwischenbericht Diplomarbeit

1 Abstrakte Klassen, finale Klassen und Interfaces

Web 2.0 Software-Architekturen

Schritt 5: Session Beans

Model-Driven Development in der Praxis. mit objectif. Herzlich willkommen

Vererbung, Polymorphie

Programmieren 2 Java Überblick

Ausnahmebehandlung in Java

Remote Method Invocation

Einstieg in die Informatik mit Java

Mapra: C++ Teil 6. Felix Gruber, Sven Groß. IGPM, RWTH Aachen. 13. Juni 2017

Analyse und praktischer Vergleich von neuen Access- Layer-Technologien in modernen Webanwendungen unter Java. Oliver Kalz

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Theorie zu Übung 8 Implementierung in Java

Enterprise JavaBeans

II.4.4 Exceptions - 1 -

Transkript:

Java Forum Stuttgart, Juli 2005, Track B7 Enterprise JavaBeans 3.0 einfach mächtig mächtig einfach Oliver Ihns Präsentation Java Forum Stuttgart 2005 Track B7, 07.07.2005 Oliver Ihns, Resco GmbH [ 1 ]

Über mich Mitglied der EJB 3.0 Expert Group im JCP bei Sun Microsystems Angestellt bei der IT-Unternehmensberatung Resco GmbH Leiter der Competence Area Enterprise Application Architecture Oliver Ihns oliver.ihns@resco.de Herausgeber und Co-Autor des Fachbuches "Enterprise JavaBeans komplett EJB 2.1" Autor diverser Fachartikel Themenschwerpunkte Software-Architekturen und Technologien für *** verteilte Softwaresysteme *** objekt-orientierte, komponenten-orientierte, service-orientierte auf Basis J2EE / EJB, CORBA, MOM, [ 2 ] www.ejbkomplett.de

Thema Enterprise JavaBeans 3.0 JSR 220 im JCP J2EE TM 5.0 SDK Status: Men at work! [ 3 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 4 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 5 ] www.ejbkomplett.de

Was bis jetzt geschah 09/2003 08/2004 09/2004 EJB 3.0 Expert Group im September 2003 formiert Erster öffentlicher Draft (Early Draft) im JCP publiziert JDO (JSR243) geht in EJB 3.0 (JSR220) auf! Die führenden JDO-Experten erweitern das EJB 3.0 Team EJB-Persistenz und JDO werden zu einer einzigen Persistenzspezifikation für J2EE / J2SE konsolidiert Im Rahmen von EJB 3.0 separate Persistenzspezifikation geplant 03/2005 Q1/2006 Zweiter öffentlicher Draft (Early Draft) im JCP publiziert Finale Veröffentlichung Q1 / 2006 Zu verfolgen im http://www.jcp.org/en/jsr/detail?id=220 [ 6 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 7 ] www.ejbkomplett.de

Hauptziele von EJB 3.0 Ease of development Ease of use [ 8 ] www.ejbkomplett.de

Hauptziele von EJB 3.0 Wichtige Randbedingungen EJB 3.0 ist abwärtskompatibel EJB 2.0/2.1 Komponenten laufen auch in EJB 3.0 Containern EJB 2.0/2.1 und EJB 3.0 Komponenten lassen sich parallel ausführen Implementierungsstile sind wahlfrei Nutzung der von EJB 3.0 verwendeten Meta-Annotationen ist optional Nutzung des komplexeren EJB 2.0/2.1 Mechanismus ist optional EJB 2.0/2.1 APIs werden ebenfalls vorsichtig vereinfacht und erweitert [ 9 ] www.ejbkomplett.de

Hauptziele von EJB 3.0 Vereinfachung der Struktur von EJB-Komponenten Bis dato für gewöhnlich fünf (5) Softwareartefakte für eine EJB-Komponente nötig Erheblicher Entwicklungsaufwand Höhere Fehleranfälligkeit bei der Implementierung Infrastruktureller Code (will keiner sehen; erst recht nicht implementieren) Reduzierung der Fragmente von EJB-Komponenten Wegfall der Home Interfaces und Callback-Interfaces Wegfall von Methoden, die nicht benötigt werden Beispiel Stateless Session Bean: create() erzeugt nichts und remove() löscht nichts Implementierung als POJOs/POJIs, statt komplexer Komponenten [ 10 ] www.ejbkomplett.de

Hauptziele von EJB 3.0 Vereinfachung des Entwicklungsprozesses Einfache Entwicklung von 'einfachen' Komponenten Förderung der testgetriebenen Entwicklung Inversion of Control Dependency Injection Verwendung von Meta-Annotationen eine Codebasis Überprüfbarkeit zur Kompilierungszeit Default-Verhalten von EJB-Komponenten Configuration by Exception Reduzierung des Programmieraufwands [ 11 ] www.ejbkomplett.de

Hauptziele von EJB 3.0 Vereinfachung der Nutzung von EJB-Komponenten Vereinfachung bestehender APIs Eliminierung von nicht (mehr) benötigten Methoden Eliminierung der ejb-callbackmethoden Vereinfachte Aufrufsemantik aus Sicht von Clients Reduzierung des Sets der APIs Wegfall von Schnittstellen, die nicht (mehr) benötigt werden Eliminieren Deployment Deskriptoren (zumindest aus Sicht des Programmierers) zu komplex zu aufwändig zu fehlerträchtig keine Prüfungen zur Kompilierungszeit [ 12 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 13 ] www.ejbkomplett.de

"Zurück" zu POJO/POJI Beispiel: EJB 2.0/2.1 Status Quo Component Interface public interface Reservierer extends EJBObject { public interface Reservierer extends EJBObject { public void reserviereflug(string flugnr, int anzplaetze, ) public void reserviereflug(string flugnr, int anzplaetze, ) throws RemoteException; throws RemoteException; public void storniereflugbuchung(int buchungkey) public void storniereflugbuchung(int buchungkey) throws RemoteException; throws RemoteException; Bean-Klasse public class ReserviererBean implements SessionBean { public class ReserviererBean implements SessionBean { private SessionContext ctx; private SessionContext ctx; public void setsessioncontext(sessioncontext ctx) { public void setsessioncontext(sessioncontext ctx) { this.ctx = ctx; this.ctx = ctx; public void ejbcreate () { public void ejbcreate () { public void ejbactivate () { public void ejbactivate () { public void ejbpassivate () { public void ejbpassivate () { public void ejbremove() { public void ejbremove() { public void reserviereflug (String flugnr, int anzplaetze, ) { public void reserviereflug (String flugnr, int anzplaetze, ) { public void storniereflugbuchung (int buchungkey) { public void storniereflugbuchung (int buchungkey) { Home Interface public interface ReserviererHome extends EJBHome { public interface ReserviererHome extends EJBHome { Reservierer create() throws CreateException, RemoteException; Reservierer create() throws CreateException, RemoteException; Deployment Deskriptor <session> <session> <ejb-name>reserviererejb</ejb-name> <ejb-name>reserviererejb</ejb-name> <home>com.example.reserviererhome</home> <home>com.example.reserviererhome</home> <remote>com.example. Reservierer</remote> <remote>com.example. Reservierer</remote> <ejb-class>com.example. ReserviererBean</ejb-class> <ejb-class>com.example. ReserviererBean</ejb-class> <session-type>stateless</session-type> <session-type>stateless</session-type> <transaction-type>container</transaction-type> <transaction-type>container</transaction-type> </session> </session> [ 14 ] www.ejbkomplett.de

"Zurück" zu POJO/POJI Beispiel: EJB 3.0 - POJO + POJI Component Interface public interface Reservierer { public interface Reservierer { public void reserviereflug(string flugnr, int anzplaetze, ); public void reserviereflug(string flugnr, int anzplaetze, ); Home Interface public void storniereflugbuchung(int buchungkey); public void storniereflugbuchung(int buchungkey); Bean-Klasse @Stateless public class ReserviererBean implements Reservierer{ @Stateless public class ReserviererBean implements Reservierer{ public void reserviereflug (String flugnr, int anzplaetze, ) { public void reserviereflug (String flugnr, int anzplaetze, ) { public void storniereflugbuchung (int buchungkey) { public void storniereflugbuchung (int buchungkey) { Deployment Deskriptor [ 15 ] www.ejbkomplett.de

"Zurück" zu POJO/POJI Beispiel: EJB 3.0 - POJO und generiertes POJI Component Interface wird generiert public interface Reservierer { public void reserviereflug(string flugnr, int anzplaetze,); Home Interface public void storniereflugbuchung(int buchungkey); Bean-Klasse @Stateless public class ReserviererBean { @Stateless public class ReserviererBean { public void reserviereflug (String flugnr, int anzplaetze,) { public void reserviereflug (String flugnr, int anzplaetze,) { public void storniereflugbuchung (int buchungkey) { public void storniereflugbuchung (int buchungkey) { Deployment Deskriptor [ 16 ] www.ejbkomplett.de

"Zurück" zu POJO/POJI Was ist passiert? Was haben wir gemacht? Forderung nach Home Interface wurde eliminiert Weniger Implementierungsaufwand Zugriff gestaltet sich aus Clientsicht einfacher Weniger Code notwendig Kein Cast über PortableRemoteObject.narrow() mehr notwendig Geschäftsschnittstelle (Business Interface (BI)) ist nun POJI Bean-Klasse kann POJI implementieren POJI kann auf Basis der Bean-Klasse (POJO) generiert werden EJB(Local)Object aus Component Interface und Clientsicht entfernt RemoteExceptions aus Component Interface und Clientsicht entfernt Geschäftsobjekt ist nun POJO Forderung nach Implementierung der Callback-Methoden eliminiert [ 17 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 18 ] www.ejbkomplett.de

Meta-Annotationen Verwendung von Meta-Annotationen im Java-Quellcode Siehe JSR 175 (A Metadata Facility for the JavaTM Programming Language ) XDoclet lässt grüßen implements SessionBean hinweg hinzu @Stateless @Remote (Reservierer.class) public class ReserviererBean { void reserviereflug(string flugnr, int anzplaetze) { wird generiert public interface ReserviererBean { void reserviereflug( ) throws RemoteExcepetion; <session> <ejb-name>reserviererejb</ejb-name> <home>com.example..reserviererhome</home> <remote>com.example..reservierer</remote> <ejb-class>com.example.reserviererbean</ejb-class> <session-type>stateless</session-type> </session> [ 19 ] www.ejbkomplett.de

Meta-Annotationen Meta-Annotationen ermöglichen der EJB-Technologie Generierung von Interfaces Steuerung des Laufzeitverhaltens von EJB-Komponenten Eliminierung der Deployment Deskriptoren Demarkation von Injection-Punkten Annotationen können erfolgen für Klassen Methoden Parameter Attribute [ 20 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 21 ] www.ejbkomplett.de

Kapselung von Umgebungs- und JNDI-Zugriffen durch Nutzung von Meta-Annotationen Dependency Annotation Dependency Injection EJB-Container initialisiert annotierte Attribute bzw. Methoden automatisch mit Referenzen auf die gewünschten Ressourcen Geschieht vor der ersten Ausführung einer Geschäftsmethode Vorteil: es muss weniger bis gar kein Code mehr geschrieben werden, um auf Ressourcen zuzugreifen [ 22 ] www.ejbkomplett.de

Kapselung von Umgebungs- und JNDI-Zugriffen Vorteil: ermöglicht ENDLICH einfaches Testen von EJB- Komponenten. J2EE-Applikationsserver als Testumgebung mehr zwingend notwendig Über setter-methoden werden einer Komponente zur Laufzeit entsprechende Informationen zur Verfügung gestellt (injiziert). Bekannt als Inversion of Control (IOC) Don t call us we call you (Hollywood-Prinzip) und Dependency Injection (DI) Neue Methode <Object lookup(string name)> zum EJBContext hinzugefügt Direkter Zugriff für Beans auf den JNDI-Baum; ohne extra Code [ 23 ] www.ejbkomplett.de

Kapselung von Umgebungs- und JNDI-Zugriffen Varianten des Zugriffs @EJB @Resource Referenzen auf EJB-Komponenten Referenzen auf Ressourcen @Stateless public class MySessionBean { @Stateless public class MySessionBean { @Resource(name= mydb ) private DataSource customerdb; @Resource(name= mydb ) private DataSource customerdb; public void mymethod (String mystring) { public void mymethod (String mystring) { try { try { Connection conn = customerdb.getconnection(); Connection conn = customerdb.getconnection(); catch (Exception ex) { catch (Exception ex) { @Session public class MySessionBean { @Session public class MySessionBean { private DataSource customerdb; private DataSource customerdb; @Resource private void setcustomerdb(datasource customerdb) { @Resource private void setcustomerdb(datasource customerdb) { this.customerdb = customerdb; this.customerdb = customerdb; public void mymethod (String mystring) { public void mymethod (String mystring) { Connection conn = customerdb.getconnection(); Connection conn = customerdb.getconnection(); [ 24 ] www.ejbkomplett.de

Dependency Injection (Varianten) Injection von "Singletons" im Container @Resource javax.ejb.sessioncontext ctx; @ Resource javax.ejb.messagedrivencontext ctx; @ Resource javax.ejb.timerservice timer; @ Resource javax.ejb.usertransaction ut; @ Resource javax.ejb.entitymanager manager; [ 25 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Neuerungen / Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 26 ] www.ejbkomplett.de

Weitere Erleichterungen in EJB 3.0 "Configuration by Exception" Spezifiziertes Default-Verhalten von EJB-Komponenten Ziel: Reduzierung der Entwicklungszeit Beispiel: EJB-Komponenten (Session Beans) sind per default lokal zugreifbar Explizite Steuerung durch Verwendung der Annotationen @Local und @Remote für das Interface bzw. die Bean-Klasse Auf Attribute von Entity Beans wird per default über get/set-methoden zugegriffen Explizite Steuerung durch Verwendung der Werte der Annotation @Entity(access=PROPERTY) und @Entity(access=FIELD) [ 27 ] www.ejbkomplett.de

Weitere Erleichterungen in EJB 3.0 Callback-Annotationen für Lifecycle Events Vordefinierte Callbacks Gekennzeichnet durch Annotationen (z.b. @PostConstruct, @PreDestroy) Session Beans, Message-driven Beans, Entity Beans Interzeptor-Methoden Abfangen von Geschäftsmethodenaufrufen Ermöglicht die Ausführung von beliebigem Code Z.B. technische Prüfungen, Security Session Beans, Message-driven Beans [ 28 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Erleichterungen Session Bean (Stateless) Message-driven Bean Entity Bean / Persistenz Resümee [ 29 ] www.ejbkomplett.de

Stateless Session Bean Home Interface entfällt Zugriff auf EJB-Komponente aus Sicht des Clients vereinfacht public static void main() throws Exception { public static void main() throws Exception { InitialContext InitialContext ctx ctx = = new new InitialContext(); InitialContext(); Object Object o o = = ctx.lookup("reservierer"); ctx.lookup("reservierer"); ReserviererHome ReserviererHome home home = = (ReserviererHome) PortableRemoteObject.narrow(o, ReserviererHome.class); (ReserviererHome) PortableRemoteObject.narrow(o, ReserviererHome.class); 2.1 Reservierer reservierer = home.create(); Reservierer reservierer = home.create(); public static void main() throws Exception { public static void main() throws Exception { InitialContext InitialContext ctx ctx = = new new InitialContext(); InitialContext(); Reservierer Reservierer reservierer reservierer = = (Reservierer) (Reservierer) ctx.lookup("reservierer"); ctx.lookup("reservierer"); // do something // do something 3.0 Keine create()-methode mehr notwendig Stateless Session Beans besitzen kein Home Interface Stateful Session Beans können create auf spezielle Init-Methoden verlagern [ 30 ] www.ejbkomplett.de

Stateless Session Bean Business-Interface muss vorhanden sein. Einfaches Java-Interface (POJI) Kein Erben von EJBObject oder EJBLocalObject damit auch keine RemoteExceptions mehr in den Methoden Business-Interface kann generiert werden Bean-Klasse muss nicht mehr das Callback-Interface javax.ejb.sessionbean implementieren ejbremove() gibt es nicht mehr ist für eine Stateless Session Bean eine völlig überflüssige Methode @Stateless annotiert Bean-Klasse als Stateless Session Bean [ 31 ] www.ejbkomplett.de

Stateless Session Bean Beispiel Component Interface public Interface Reservierer { public Interface Reservierer { public void reserviereflug (String flugnr, int anzplaetze); public void reserviereflug (String flugnr, int anzplaetze); public void storniereflugbuchung (int buchungkey); public void storniereflugbuchung (int buchungkey); Bean-Klasse @Stateless @Stateless public public class class ReserviererBean ReserviererBean implements implements Reservierer Reservierer { { public void reserviereflug (String flugnr, int anzplaetze) { public void reserviereflug (String flugnr, int anzplaetze) { public public void void storniereflugbuchung storniereflugbuchung (int (int buchungkey) buchungkey) { { [ 32 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Erleichterungen Session Bean (Stateful) Message-driven Bean Entity Bean / Persistenz Resümee [ 33 ] www.ejbkomplett.de

Stateful Session Bean Kein Home Interface mehr benötigt Zugriff analog Zugriff auf Stateless Session Bean Keine create()-methode mehr obligatorisch existent Initialisierung der Bean erfolgt durch entsprechende Geschäftsmethode in Diskussion, ob die Kennzeichnung einer solchen Methode über Annotation erfolgt Muss ein Business-Interface haben Einfaches Java-Interface (POJI) Kein erben von EJBObject oder EJBLocalObject damit auch keine RemoteExceptions mehr in den Methoden Business-Interface kann generiert werden [ 34 ] www.ejbkomplett.de

Stateful Session Bean Bean-Klasse muss nicht mehr das Callback-Interface javax.ejb.sessionbean implementieren (optional) @Stateful annotiert Bean-Klasse als Stateful Session Bean remove()-methode kann beliebige Methode der Bean-Klasse sein Annotiert durch @Remove [ 35 ] www.ejbkomplett.de

Stateful Session Bean Beispiel Component Interface public public Interface Interface FlugzeugBelegungsManager FlugzeugBelegungsManager { { public public void void reserviereflug reserviereflug (String (String flugnr, flugnr, int int anzplaetze); anzplaetze); public void storniereflugbuchung (int buchungkey); public void storniereflugbuchung (int buchungkey); @Remove @Remove public public void void closemanager(); closemanager(); Bean-Klasse @Stateful @Stateful public public class class FlugzeugBelegungsManagerBean FlugzeugBelegungsManagerBean implements implements FlugzeugBelegungsManager FlugzeugBelegungsManager { { public void reserviereflug (String flugnr, int anzplaetze) { public void reserviereflug (String flugnr, int anzplaetze) { public public void void storniereflugbuchung storniereflugbuchung (int (int buchungkey) buchungkey) { { @Remove public void closemanager() { @Remove public void closemanager() { // do some cleanup // do some cleanup [ 36 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 37 ] www.ejbkomplett.de

Message-driven Bean MDB muss entweder mit @MessageDriven Annotation gekennzeichnet werden oder das Callback-Interface javax.ejb.messagedrivenbean implementieren. [ 38 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 39 ] www.ejbkomplett.de

Entity Bean / Persistenz Weiterentwicklung Persistenz CMP/BMP Nutzung vereinfachen Leistungsumfang erhöhen Schwerpunkt CMP Ziel: Simplifizierung von Entity Beans POJOs Konkrete Klasse; nicht mehr abstrakt @Entity annotiert Bean-Klasse als Entity Bean Leichtgewichtiges Domänen-Objekt Entity Beans sind nicht mehr direkt entfernt zugreifbar! [ 40 ] www.ejbkomplett.de

Entity Bean / Persistenz Zugriff erfolgt nur noch über neu eingeführten javax.ejb.entitymanager EntityManager Erzeugen und Löschen von persistenten Entity-Instanzen Finden von Entitäten über Primärschlüssel Abfragen über Entitäten Beispiel @Stateless public class OrderEntry { @Stateless public class OrderEntry { EntityManager em; EntityManager em; @Inject public void setentitymanager(entitymanager em) { @Inject public void setentitymanager(entitymanager em) { this.em = em; this.em = em; public int createorder(string articleno, int quantity, ) { public int createorder(string articleno, int quantity, ) { Order order = new Order(articleNo, quantity, ); Order order = new Order(articleNo, quantity, ); em.create(order); em.create(order); return order.getid(); return order.getid(); public Order find(int id) { public Order find(int id) { return em.find(order.class, id); return em.find(order.class, id); public void enterorder(int custid, Order neworder) { public void enterorder(int custid, Order neworder) { Customer cust = (Customer)em.find("Customer", custid); Customer cust = (Customer)em.find("Customer", custid); cust.getorders().add(neworder); cust.getorders().add(neworder); neworder.setcustomer(cust); neworder.setcustomer(cust); [ 41 ] www.ejbkomplett.de

Entity Bean / Persistenz Entity Beans beherrschen nun Vererbung und Polymorphie Polymorphe EJB QL-Abfragen sind nun zulässig Kein Home Interface mehr nötig Kein Business Interface mehr nötig (technisch betrachtet ;-) JavaBean-Stil Attribute sind nur per getter/setter-methoden zugreifbar Eliminieren der komplexen, aufwändigen und fehleranfälligen Deployment Deskriptoren Beziehungen etc. werden in den Klassen per Annotationen deklariert [ 42 ] www.ejbkomplett.de

Entity Bean / Persistenz Kein DTO für Transport von Entity Bean-Daten mehr notwendig Entity Bean selbst wird transferiert (detached object) Nach Änderungen am 'detached object' können diese mit dem persistenten Zustand zusammengebracht werden (reattached object) [ 43 ] www.ejbkomplett.de

Entity Bean / Persistenz Beispiel Bean-Klasse @Entity @Entity @Table(name = "PURCHASE_ORDER") @Table(name = "PURCHASE_ORDER") public class Order implements java.io.serializable { public class Order implements java.io.serializable { private int id; private int id; private double total; private double total; private Collection<LineItem> lineitems; private Collection<LineItem> lineitems; @Id(generate = GeneratorType.AUTO) public int getid() { return id; @Id(generate = GeneratorType.AUTO) public int getid() { return id; public void setid(int id) { this.id = id; public void setid(int id) { this.id = id; public double gettotal() { return total; public double gettotal() { return total; public void settotal(double total) { this.total = total; public void settotal(double total) { this.total = total; public void addpurchase(string product, int quantity, double price) { public void addpurchase(string product, int quantity, double price) { if (lineitems == null) lineitems = new ArrayList<LineItem>(); if (lineitems == null) lineitems = new ArrayList<LineItem>(); LineItem item = new LineItem(); LineItem item = new LineItem(); item.setorder(this); item.setorder(this); @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) @JoinColumn(name = "order_id") @JoinColumn(name = "order_id") public Collection<LineItem> getlineitems() { public Collection<LineItem> getlineitems() { return lineitems; return lineitems; public void setlineitems(collection<lineitem> lineitems) { public void setlineitems(collection<lineitem> lineitems) { this.lineitems = lineitems; this.lineitems = lineitems; [ 44 ] www.ejbkomplett.de

Weiterentwicklung EJB QL Sub Queries SELECT goodcustomer SELECT goodcustomer FROM Customer goodcustomer FROM Customer goodcustomer WHERE WHERE goodcustomer.balance goodcustomer.balance < < ( ( SELECT SELECT avg(c.balance) avg(c.balance) FROM FROM Customer Customer c) c) GroupBy Having SELECT SELECT c.status, c.status, avg(c.filledordercount), avg(c.filledordercount), count(c) count(c) FROM Customer c FROM Customer c GROUP GROUP BY BY c.status c.status HAVING HAVING s.status s.status IN IN (1, (1, 2) 2) Explizite Inner-Joins und Outer-Joins [ 45 ] www.ejbkomplett.de

Weiterentwicklung EJB QL Projections SELECT c.id, c.status SELECT c.id, c.status FROM Customer c JOIN c.orders o FROM Customer c JOIN c.orders o WHERE o.count > 100 WHERE o.count > 100 Liefert ein Array von java.lang.object- Objekten SELECT SELECT new new CustomerDetails(c.id, CustomerDetails(c.id, c.status, c.status, o.count) o.count) FROM FROM Customer Customer c c JOIN JOIN c.orders c.orders o o WHERE WHERE o.count o.count > > 100 100 Liefert eine Liste von CustomerDetails- Objekten Bulk updates, Bulk deletes DELETE DELETE FROM Customer c FROM Customer c WHERE WHERE c.status c.status = = inactive inactive AND AND c.orders c.orders IS IS EMPTY EMPTY [ 46 ] www.ejbkomplett.de

Weiterentwicklung EJB QL Unterstützung für native SQL-Abfragen Zusätzliche Funktionen in Where-Klausel UPPER LOWER TRIM POSITION CHARACTER_LENGTH CHAR_LENGTH BIT_LENGTH CURRENT_TIME CURRENT_DATE CURRENT_TIMESTAMP [ 47 ] www.ejbkomplett.de

Weiterentwicklung EJB QL Dynamische Abfragen, Named-Queries // // Erzeugen Erzeugen einer einer NamedQuery NamedQuery @NamedQuery( @NamedQuery( name="findallcustomerswithname", name="findallcustomerswithname", querystring="select c FROM Customer c WHERE c.name LIKE :custname" querystring="select c FROM Customer c WHERE c.name LIKE :custname" ) ) // Nutzen einer NamedQuery // Nutzen einer NamedQuery @Inject public EntityManager em; @Inject public EntityManager em; customers = em.createnamedquery("findallcustomerswithname") customers = em.createnamedquery("findallcustomerswithname").setparameter("custname",.setparameter("custname", "Smith") "Smith").listResults();.listResults(); Polymorphe Abfragen Liefert als Ergebnis nicht nur den spezifizierten Typ, sondern auch alle Subtypen [ 48 ] www.ejbkomplett.de

Agenda Was bis jetzt geschah Hauptziele von EJB 3.0 "Zurück" zu POJO/POJI Verwendung von Meta-Annotationen Kapselung von Umgebungs- und JNDI-Zugriffen Weitere Erleichterungen Session Bean Message-driven Bean Entity Bean / Persistenz Resümee [ 49 ] www.ejbkomplett.de

Resümee EJB 3.0 Statt komplexer Komponenten einfache POJOs / POJIs Verkürzung der Entwicklungszeit Wegfall von überflüssigen Interfaces (Home Interface, Component Interface und der Typen-Callback Interfaces) Bessere und einfachere Modellierbarkeit Einfache Java-Klassen mit allen Vorteilen von Container-Komponenten Statt Deployment Deskriptoren Meta-Annotation im Java-Code Nur noch eine Codebasis Erlaubt nun Prüfungen zur Kompilierungszeit Inversion of Control / Dependency Injection Configuration by Exception Vereinfachung der Entwicklung (Reduzierung Code und Entwicklungszeit) [ 50 ] www.ejbkomplett.de

Resümee EJB 3.0 Mit EJB 3.0 wird die Komponententechnologie erheblich einfacher und gleichzeitig mächtiger. EJB 3.0 wird die Entwicklung von komponenten-basierten Systemen beschleunigen Konkurrenz.NET Das leidige Thema der konkurrierenden Persistenzstrategien innerhalb von J2EE/J2SE wird mit EJB 3.0 endlich behoben es gibt nur noch eine Lösung [ 51 ] www.ejbkomplett.de

Die EJB 3.0 Begleit-Kolumne - Kolumne Ab Ausgabe 01/05 in jeder Ausgabe des Javamagazins ein Kolumnen-Artikel zu EJB 3.0 Jeweils die aktuellsten Informationen direkt aus der EJB 3.0 Expert Group Beleuchtet in jeder Ausgabe dediziert einen Aspekt der kommenden Version Laufzeit: voraussichtlich bis zum finalen Release von EJB 3.0 Q1 / 2006 [ 52 ] www.ejbkomplett.de

Ende - Vielen Dank! oliver.ihns@resco.de Weitere Informationen zu EJB 2.1 und EJB 3.0 unter www.ejbkomplett.de [ 53 ] www.ejbkomplett.de