Transcript
Page 1: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

Prof. Dr. Nikolaus Wulff

Web 2.0 Software-Architekturen

Enterprise Java Beans, die Java Persistence und Transaction API, sowie der OR Mapper Hibernate

Page 2: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 2

Java Enterprise Edition• Zusätzlich zu dem der reinen Java Runtime

Environment (JRE) und dem Java Developer Kit (JDK) existiert für Serveranwendungen noch die spezielle Java Enterprise Edition (J2EE).

• Sie stellt APIs für Sicherheit verteilte Anwendungen mit Servlets, JSP, JSF, WebServices, Transaktionen und persistenten Klassen zur Verfügung.

• Ursprünglicher zentraler Bestandteil neben den Servlets waren die Entity Java Beans (EJB).

• EJBs sind Objekte die sowohl persistent in einem RDBMS als auch verteilt innerhalb eines Containers gespeichert und ausgeführt werden.

Page 3: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 3

Problemstellung verteilte Dienste

• Heterogene Plattformen• Referenzierung von Objekten an unterschiedlichen

Lokationen• Speicher Verwaltung• Unterschiedliche Programmiersprachen• Unterschiedliche Netzwerk Protokolle• Persistenz in verteilten Umgebungen

• Standardisierung

Page 4: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 4

HelloWorld Pseudo Code

• Lokaler Methodenaufruf: HelloInterface h = new HelloImpl();

h.sayHello("HelloWorld");

• Remote Methodenaufruf: HelloInterface h = HelloFactory.lookup("myServer","myObject");

h.sayHello("HelloWorld");

dauert ~ 1 - 4 NanoSec

dauert ~ 5 - 50 MilliSec !!!

Page 5: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 5

RMI

RMI Architektur

Client Application

RemoteObject

StubClass

SkeletonClass

Remote Reference Layer

Transport Layer (JRMP)

RemoteInterface

Page 6: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 6

HelloWorld mit RMI

RMIFramework

generatedby RMIC

Developerdefined

Page 7: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 7

Start des Hello Serverspublic class HelloImpl implements HelloInterface { // ...public static void main(java.lang.String[] args) { try { String url = args[0];

// 1. Server Instanz erzeugen System.out.println("Erzeuge Server"); HelloImpl hello = new HelloImpl(); // 2. Server Instanz beim Naming Service bekannt machen System.out.println("Registriere Server "+hello); Naming.rebind(url,hello);

System.out.println("Server "+url+" ready... “); }catch(Exception e) { System.err.println(e); e.printStackTrace(); }}

Page 8: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 8

HelloClient mit RMI

public static void main(java.lang.String[] args) { throws Exception { String url = args[0]; // 1. Referenz auf den Server per Naming Service System.out.println("Suche Server "+url); Remote ref = Naming.lookup(url); // 2. Cast auf den gewünschten Typ HelloInterface hello = (HelloInterface) ref; System.out.println("Fand "+hello);

// 3. Remote Call ausführen long time = System.currentTimeMillis(); hello.sayHello("Hello vom HelloClient "+time);

System.out.println("done ...");}

Page 9: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 9

CORBA Architektur

Client Application

Corba Object (Servant)

IDL StubClass

(z.B. Java)

IDL SkeletonClass

(z.B. C++)

ORB(z.B. Visigenic)

ORB(z.B. Iona Orbix)

CORBAInterface

IDL Beschreibung

IIOPTCP/IP

ORB Interface

Page 10: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 10

HelloWorld mit CORBA

CORBAFramework

Developerdefined

generatedby IDLJ

Page 11: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 11

HelloClient mit CORBA

public static void main(java.lang.String[] args) { throws Exception { String name = args[0]; // 0. Referenz auf ORB Singleton und den NamingService org.omg.CORBA.ORB orb = ORB.init(args,null); NamingContext naming = getNamingContext(orb); // 1. Lookup mittels NamingService NameComponent[] component= {new NameComponent(name,"")}; org.omg.CORBA.Object ref = naming.resolve(component); // 2. CORBA Cast per narrow mit Helper Klasse HelloInterface hello = HelloInterfaceHelper.narrow(ref); System.out.println("Fand "+hello);

// 3. Remote Call ausführen long time = System.currentTimeMillis(); hello.sayHello("Hello vom HelloClient "+time);

}

Page 12: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 12

Was fehlt...?

• Das RMI und CORBA Beispiel zeigt:– Lookup der Remote Objekte per Naming Service– einfacher Methodenaufruf des Remote Objektes

• was fehlt ist die HighLevel Architektur für:– Client-Server generell– Objekt Lifecycle– Session Handling– Transaktionen (Two-Phase-Commit)– Objektpersistenz und -referenzierung– ...

Page 13: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 13

Von RMI zu EJB

• Native RMI bietet wenig Unterstützung hinsichtlich C/S-Architekturen

• CORBA enthält viele Services wie– TransactionService– SecurityService– EventService – ...

Unterstützung der Hersteller war zurückhaltend...• Sun legte 1998 mit der EJB1.0 Spezifikation ein

neues objektorientiertes Komponentenmodel für verteilte Anwendungen vor, das nahtlos in die Java2 Enterprise Edition (J2EE) integriert ist.

Page 14: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 14

EJB in a Nutshell

• EJBs laufen in einem ApplikationsServer und werden von einem EJBContainer verwaltet.

EJB Server

EJB Container

Client EJB Bean

EJB HomeInterface

EJB RemoteInterface

Page 15: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 15

Die Schnittstellen im Überblick

Page 16: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 16

Die EJB 1.0 & 2.0 Schnittstelle

• Eine Enterprise JavaBean besitzt für den Client zwei öffentlich sichtbare Schnittstellen:

• EJB-Home– es spezifiziert die Lookup- und Finder-Methoden um

eine Referenz auf das Remote Interface zu erhalten

• EJB-Remote– es stellt die eigentliche öffentliche Schnittstelle der

EJB da. Hier sind die Business-Methoden der EJB deklariert.

• Seit EJB 2.1 EJB-Lokal nicht sichtbar für Client!– Bietet Klassen auf der Serverseite Zugriff auf die

Business-Methoden der EJB ohne Netzwerkzugriff.

Page 17: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 17

Der EJB Container• Zentraler Bestandteil der EJB Spezifikation ist der EJB

Container, er ist zuständig für:– Persistenz der EJBs– Transaktionen– Sicherheitsaspekte– Lifecycle und Runtimesupport

• Ein EJB Container Provider wird den Entwickler mit entsprechenden Tools für das Deployment und Monitoring der EJBs ausstatten.

• EJB Server und EJB Container Provider sind meist identisch.

• Die Spezifikation schreibt die API zwischen dem Server und dem Container nicht vor.

Page 18: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 18

EJB Rollen • Developer / EJB Provider

– definiert Remote- und Home-Interface und die Implementierung

• Application Assembler– verwendet die EJBs und bindet sie in den Kontext einer

Applikation ein

• Deployer– integriert die ejb-jar Archive in einen EJB Server und

generiert die serverspezifischen Stub- und Skeltonklassen für die Verteilung.

• System Administrator– administriert Transaction, Security, Container, Server und

Resourcen

• Server Provider und Container Provider

Page 19: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 19

EJB im J2EE Model

ResourcenDatenbanken und externe Systeme

Integrations EbeneJMS, JDBC, Connectors und Legacy

Business EbeneEJBs und JavaBeans

PräsentationJSP, Servlets und andere UI

Client Applikationen, Applets, Browser

Benutzer Interaktion

Single sign-on,Sessionverwaltung,Formatierung und Zustellung

Geschäftslogik, Transaktionen, Daten und Services

Resource adapters, rule engine und workflow, Altanwendungen

Daten und externe Dienste

Page 20: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 20

J2EE Architektur

HTTPSSLBrowser

ApplicationClient Container

J2SE

ApplicationClient,Applet

JDBC

RM I- IIOP

JNDIJMS

Web Container

J2SE

EJB Container

J2SE

Database

EJB

JDBC

RM I- IIOP

JNDIJMS JTA JavaMail

JAF

JDBC

RM I- IIOP

JNDIJMS JTA JavaMail

JAF

JSP Servlet

HTTPSSL

RMI

Page 21: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 21

EJB Typen• Session Bean: kapseln Applikationslogik, dienen als

Fassade, um Kommunikation zwischen Client- und Serverkomponenten zu orchestrieren.

● Sie können mit oder ohne Zustand behaftet sein.

• Entity Bean: Persistente Business Objekte, DB Zugriffe sind transparent vor dem Client verborgen.

● Persistenz kann automatisch vom Container verwaltet werden, container managed persistence (CMP), oder direkt „per Hand“ eingebaut werden, bean managed persistence (BMP).

• Message Bean: EJB Variante für asynchrone Nachrichten nach der JMS Spezifikation. Ohne Home Interface und Zustand.

• WebService: spezielle stateless Session Bean

Page 22: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 22

EJB TypenLogische Hierarchie

Page 23: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 23

HelloWorld mit EJB

EJBFrameworkEJBFramework

Developerdefined

Page 24: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 24

EJB Clientpublic static void main(java.lang.String[] args) {throws Exception { HelloHome home; String jndiName = args[0]; Context context = new InitialContext(); // 1. Referenz auf den Server per JNDI System.out.println("Suche Server "+jndiName); Object ref = context.lookup(jndiName); // 2. RMI-IIOP Cast auf das HomeInterface home = (HelloHome) PortableRemoteObject.narrow( ref,HelloHome.class); // 3. Create Methode zum Erzeugen des EJBObjects HelloInterface hello = home.create(); System.out.println("Fand "+hello); // 4. Remote Call ausführen long time = System.currentTimeMillis(); hello.sayHello("Hello vom HelloClient "+time); }

Page 25: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 25

Einsatzbereich von EJBsJe nach Aufgabenstellung werden unterschiedliche EJBs verwendet:

• Stateless SessionBean: Allgemeine Services

• Statefull SessionBean: Benutzerspezifischer Service, wird häufig zur Transaktionssteuerung der persistenten Objekte verwandt.

• Entity Bean: Langlebige persistente Objekte verwaltet innerhalb einer Datenbank.

• Message Bean: Asynchrone Kommunikation.

• WebService: wie der Name sagt...

Page 26: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 26

LifeCycle

• Der EJB-Container übernimmt die EJB Erzeugung, Aktivierung, Passivierung und Vernichtung.

• Hierzu dienen die Schnittstellenmethoden ejbCreate, ejbActivate, ejbPassivate und ejbRemove, seit V3.x durch @PostCreate, @PreDestroy, …, markiert.

• Im Home Interface sind weitere Finder Methoden vermerkt. Je nach Bean Typ sind unterschiedliche Szenarien vorgesehen.

• Die EJB Spezifikation schreibt vor, in welcher Reihenfolge diese Methoden vom Container auszurufen sind.

Page 27: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 27

Stateless SessionBean

Does not Exist

Method-ReadyPool

Class.newInstance()setSessionContext()ejbCreate()

ejbRemove()

business method

Page 28: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 28

Stateful SessionBean

Does not Exist

Method-Ready

business method

Passive

instance throwssystem exception

Class.newInstance()setSessionContext()ejbCreate()

ejbRemove()

ejbPassivate()

ejbActivate()

timeout

timeout

Page 29: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 29

BMP

EntityBean

Pooled

Ready

Class.newInstance()setEntityContext()

business method

Does not Exist

ejbRemove()ejbCreate()ejbPostCreate()

Object.finalize()unsetEntityContext()

ejbPassivate()

ejbActivate()

ejbLoad()ejbStore()

ejbFind()ejbSelect()

Page 30: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 30

Message-Driven Bean

Does not Exist

Method-ReadyPool

Class.newInstance()setMessageDrivenContext()ejbCreate()

ejbRemove()

onMessage()

Page 31: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 31

1:1 1:N und N:M Beziehungen• Beziehungen zwischen EntityBeans werden vom EJB

Container verwaltet.

• Da die EJB Klassen abstrakt sind, können diese nicht direkt vom Entwickler gepflegt werden, es müssen entsprechende abstrakte Setter- und Getter-Methoden in der EJB vorgesehen werden.

• I.A. werden die Assoziationen bei der Erzeugung der Bean gesetzt. Dies darf allerdings nicht bei ejbCreate sondern erst beim ejbPostCreate Event geschehen.

Page 32: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 32

ejbPostCreate

• Die ejbCreate-Methode wird gerufen bevor eine EntityBean in der Datenbank angelegt wird.

• Bei BMP Beans muss jetzt vom Entwickler selbständig für die Persistenz gesorgt werden.

• Falls die EJB Fremdbeziehungen zu anderen Beans hat, so werden diese in der ejbCreate-Methode übergeben, dürfen jedoch noch nicht gesetzt werden. Hierzu ist eine ejbPostCreate-Methode mit gleicher Signatur notwendig.

• ejbPostCreate wird gerufen nachdem ein Record für die EJB in der Datenbank angelegt ist.

Page 33: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 33

ejbPostCreate Beispiel

• ShoppingCart wird bei der Erzeugung mit einer lokalen UserBean assoziert.

public abstract class ShoppingCartBean implements EntityBean { public Long ejbCreate(UserLocal user) throws CreateException { setId(createPk()); return null; } public void ejbPostCreate(UserLocal user) throws CreateException {

setUserLocal(user); }

Page 34: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 34

1:N Beziehung mit XDoclet

• 1:N Beziehung zwischen User und ShoppingCard, notiert mit XDoclet.

/** * @ejb.interface-method generate="local" * @ejb.relation name="USER-TO-SHOPPINGCART" * role-name="user-of-shoppingcart" * target-ejb="User" * target-role-name="ShoppingCart-to-one-User" * * @jboss.relation fk-column="user_id" * related-pk-field="id" */ public abstract UserLocal getUserLocal(); /** * @ejb.interface-method generate="local" */ public abstract void setUserLocal(UserLocal user);

Page 35: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 35

ShoppingCart getUser

• Der ShoppingCart User wird in der ejbCreate-Methode als lokale Objekt gesetzt.

• Per getUser kann auf die lokale Instanz remote zugegriffen werden...

/** * @ejb.interface-method * */public User getUser() throws EJBException { try { UserLocal userLocal = getUserLocal(); return getUserHome().findByPrimaryKey( userLocal.getId()); } catch(Exception e) {

throw new EJBException("getUser: "+e,e); }}

Page 36: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 36

Die Many Beziehung

• In der UserBean ist die many Relation hinterlegt

• JBoss generiert auch die Relationstabelle...

/** * @ejb.interface-method * @ejb.relation name="USER-TO-SHOPPINGCART" * role-name="user-has-shoppingcarts" * target-ejb="ShoppingCart" * target-multiple="true" * * @jboss.relation fk-column="cart_id" * related-pk-field="id" */ public abstract Collection getShoppingCarts();´ /** * @ejb.interface-method */ public abstract void setShoppingCarts(Collection carts);

Page 37: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 37

/** * @ejb.bean name="ShoppingCart" * type="CMP" cmp-version="2.x" primkey-field="id" * view-type="both" jndi-name="ejb/ShoppingCart" * * @ejb.ejb-ref ejb-name="Book" * @ejb.ejb-ref ejb-name="User" * * @ejb.finder signature="Collection findAll()" * query="SELECT OBJECT(o) FROM ShoppingCart AS o" * * @ejb.finder signature="Collection findByUser(bookstore.bean.User user)" * query="SELECT OBJECT(o) FROM ShoppingCart AS o WHERE o.userLocal = ?1" * * @ejb.transaction type="Required" * @ejb.data-object equals="true" * @ejb.pk generate="false" * @ejb.persistence table-name="SHOPPINGCARTS" * @ejb.value-object name="ShoppingCart" match="*" * * @jboss.create-table "true" * @jboss.remove-table "true" * @jboss.tuned-updates "false" * @jboss.read-only "false" *

OQL Tabellen Generierung

Page 38: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 38

EJB 2.x Entwicklung

• Schritte zur Erstellung einer EnterpriseBean:– Design der Remote (Business) Schnittstelle.

– Erstellung einer Home Schnittstelle mit Create- und Finder-Methoden.

– Codierung einer Bean Implementierung mit passenden ejbCreate- und ejbFinder-Methoden.

– Implementierung der Business-Methoden in der Bean.

– Testen der Lokalen Bean.

– Erstellung eines Deployment-Deskriptors.

– Packen des Archives

– Deployment im ApplicationServer

– Testen der Remote Bean.

Page 39: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 39

Bookstore Factory Fassade

• Die BookstoreBean dient als Fassade, um eine ShoppingCart für einen User zu erzeugen.

• Die ShoppingCart ejbCreate-Methode erwartet eine Bean vom Typ UserLocal, die passend zur User Referenz gefunden werden muss.

• Die Lokale Referenz kann mit der LokalHome Schnittstelle und dem PrimaryKey der Bean ermittelt werden.

• Die Schritte sind invers zu der getUser Methode der ShoppingCart.

Page 40: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 40

Bookstore Factory Methode

• Zum Erzeugen einer ShoppingCart im Bookstore ist eine lokale UserBean notwendig.

• Per findByPrimaryKey mit UserLocalHome...

public ShoppingCart createShoppingCart(User user) throws EJBException { try { ShoppingCartHome home = getShoppingCartHome(); UserLocalHome localHome = getUserLocalHome(); UserLocal localUser = localHome.findByPrimaryKey(user.getId());

ShoppingCart cart = home.create(localUser); return cart; } catch (Exception ex) { throw new EJBException(ex); }}

Page 41: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 41

XDoclet versus ejb-jar.xml

• Die vielen Annotationen für XDoclet wirken auf den ersten Blick sehr unübersichtlich.

• Tatsächlich sind sie jedoch ein großer Fortschritt:– alle Annotationen hätten per Hand in der ejb-jar.xml

selber codiert werden müssen.

– alle Home, LocalHome sowie Data und Value Klassen hätten händisch immer parallel codiert werden müssen.

– Das Datenbankschema hätte händisch synchronisiert werden müssen.

• Diese Aufgaben werden von XDoclet übernommen.

• In der EJB 3.0 Spezifikation wird dies durch die neuen JDK1.5 Annotation automatisiert...

Page 42: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 42

EJB3 Session Beans

• Annotations kennzeichnen den Life-Cycle.

• Meist wird ein Business Interface deklariet von dem eine Lokal- und eine Remote-Schnittstelle ab-geleitet werden die in einer POJO Bean implemen-tiert sind.

• Die EJB Schnittstellen werden mit @Remote und @Local gekennzeichnet, die Implementierung mit @Stateless bzw. @Statefull.

• Die ejbCreate und ejbRemove Methoden können frei vergeben werden und sind mit @PostCreate und @PreDestroy zu annotieren.

Page 43: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 43

Stateless Session Beispiel

• Implementierung:

/** * Calculator service interface. */public interface Calculator extends Serializable { double calculate(double x, char op, double y);}

@Remotepublic interface CalculatorRemote extends Calculator {}@Localpublic interface CalculatorLocal extends Calculator {}

@Statelesspublic class CalculatorBean implements CalculatorRemote, CalculatorLocal { @PostConstruct protected void created() { System.out.println("created " + this); }

Page 44: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 44

Test der Sesson Bean• Die Bean wird per JNDI Kontext referenziert: private Calculator service; /** * @throws java.lang.Exception */ @Before public void setUp() throws Exception { Context ctx = new InitialContext(); service = (Calculator) ctx.lookup(jndiName); assertNotNull("no calculator service found", service); } /** * Test method for {@link de.lab4inf.service.Calculator#calculate(double, char, double)}. */ @Test public void additionTest() throws Exception { double x = 2.3, y = 3.6; assertEquals(x + y, service.calculate(x, '+', y), eps); }

Page 45: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 45

EJB3.x persistente EntityBean

• Seit dem JDK1.5 hat das Konzept der Annotations Einzug in die EJB 3.0 Spezifikation gefunden.

• Die XDoclet Tags können fast 1:1 als Annotations formuliert werden.

• EJBs sind jetzt reine Plain-Old-Java-Objects (POJO)

• Annotations des javax.persistence Pakets:– @Entity Markiert die Klasse als EJB

– @Table Gibt den Tabellennamen des Mappings an

– @Column Speichert das Attribut in der Tabellenspalte

– @Id Markiert den PrimaryKey der Tabelle

Page 46: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 46

EJB3.0 Annotations Beispiel

public javax.persistence.*;@Entity@Table(name="book")@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)public class Book { private Integer id; @Column(name="title") private String title; // and further attributes ... /** * @return the id */ @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; }

Page 47: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 47

EJB3.x per Hibernate

• Hibernate ist ein OR-Mapper, der direkt die EJB3.x Annotations verwendet.

• Ganz “normale POJOs” können direkt mit Hibernate persistent gemacht werden und sie unterscheiden sich nicht von gleichartigen EJB 3.x Instanzen.

• Die Entscheidung ob ein POJO eine EJB ist, wird erst zur Laufzeit vom Container entschieden...

• Ein EJB3.0 Container generiert den passenden “Glue-Code” für die Remote Schnittstellen, Hibernate belässt es bei der reinen Persistenz.

Page 48: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 48

JPA Features

• @Id als Primärschlüssel– Generatoren mit verschiedenen Algorithmen

• Property/Attribute als Tabellenspalten

• Assoziationen

– One-to-one @OneToOne

– Many-to-one @ManyToOne, @OneToMany

– Many-to-Many @ManyToMany

• Vererbung mit verschiedene Strategien. Dies gilt sowohl für EJB3.x als auch Hibernate.

Page 49: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 49

Hibernate Featuers cont.• Die Zuordnung von Klassen zu Tabellen kann

sprachneutral in einer externen XML Konfiguration verwaltet werden.

• Dies gestattet es die Persistenz komplett von dem Java Code der Businessklassen zu entkoppeln.

• In Java werden zunehmend @Annotationen direkt im Java Code eingesetzt. Dann ist allerdings die Entkopplung zum Teil durchbrochen, da das Tabellenschema in den Annotationen fixiert ist.

• Hibernate generiert auf Wunsch die entsprechenden SQL Schemadefinitionen und führt sie aus.

Page 50: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 50

Hibernate XML Mapping

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping package="de.lab4inf.animals">

<class name="Dog" table="dogs" discriminator-value="D">

<id name="id">

<generator class="native"/>

</id>

<discriminator column="subclass" type="character"/>

<property name="weight"/>

<property name="birthdate" type="date" not-null="true" update="false"/>

</class>

</hibernate-mapping>

Page 51: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 51

Hibernate Annotations Beispiel

public javax.persistence.*;@Entity@Table(name="book")@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)public class Book { private Integer id; @Column(name="title") private String title; // and further attributes ... /** * @return the id */ @Id @GeneratedValue(strategy = GenerationType.AUTO) public Integer getId() { return id; }

Page 52: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 52

Hibernate JPA u JTA• Hibernate unterstützt sowohl die Java Persitence API

als auch die Java Transaction API.

• Dies gestattet es Hibernate quasi wie einen EJB Container mit den entsprechenden Annotationen und Session und Transaktionen zu verwenden, ohne im Quelltext explizit Hibernate Spezifika zu codieren.

• Hibernate implementiert die JTA Abstraktionen (Datenbank)Session und Transaction.

• Lediglich die Hiberntate Query Language HQL (ähnlich zu OQL) verrät das Programmiermodell…

• Hibernate wird häufig im Zusammenspiel mit Spring anstatt eines EJB3.0 Containers eingesetzt.

Page 53: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 53

Hibernate JUnit Test Bootstrap• Eine Hibernate Configuration wertet die hibernate.cfg

aus und erzeugt eine SessionFactory.

• Mit Hilfe der SessionFactory lassen sich Session(s) und damit wiederum Transaction Instanzen erzeugen:

@BeforeClass public static void setUpBeforeClass() throws Exception { Configuration config = new Configuration(); // use Hibernate configuration, parsing the sessionFactory = config.configure().buildSessionFactory(); // hibernate.cfg.xml file and create a factory. assertNotNull("SessionFactory is null", sessionFactory); }

@Before public void setUp() throws Exception { session = sessionFactory.openSession(); assertNotNull("Session is null", session); tx = session.beginTransaction(); underTest = createTestee(); }

@Test public void testGetId() { assertTrue("testee has id", 0==underTest.getId()); session.save(underTest); tx.commit(); assertTrue("id not set", underTest.getId()>0); }

CRUD Semantik:CommitRollbackUpdateDelete

Page 54: Web 2.0 Software-Architekturen - fh-muenster.de · Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen Enterprise Java Beans, die Java Persistence und Transaction API, sowie der

© Prof. Dr. Nikolaus Wulff Web 2.0 Software-Architekturen 54

• EJBs sind ein recht schwergewichtiges Architektur-modell. Das Vermischen von Verteilung und Persistenz erwies sich für viele Projekte als zu kom-pliziert. Insbesondere die verschiedenen zu einander inkompatiblen EJB Standards sorgten für viel Missmut und Misskredit.

• Mit Spring und Hibernate wurde dem Rechnung getragen. Hibernate beschränkt sich alleine auf die Aspekte der Persistenz und erlaubt ein schnelleres Abbilden von Klassen auf ein RDBMS.

• Von Vorteil ist, dass dies komform zur EJB3 Schnittstelle gelingt.

Zusammenfassung


Recommended