Web 2.0 Software-Architekturen

Werbung
Web 2.0
Software-Architekturen
Enterprise Java Beans, die Java Persistence und Transaction API, sowie der
OR Mapper Hibernate
Prof. Dr. Nikolaus Wulff
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
2
Problemstellung verteilte Dienste
• Heterogene Plattformen
• Referenzierung von Objekten an unterschiedlichen
Lokationen
• Speicher Verwaltung
• Unterschiedliche Programmiersprachen
• Unterschiedliche Netzwerk Protokolle
• Persistenz in verteilten Umgebungen
•  Standardisierung
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
3
HelloWorld Pseudo Code
• Lokaler Methodenaufruf:
dauert ~ 1 - 4 NanoSec
HelloInterface h = new HelloImpl();
h.sayHello("HelloWorld");
• Remote Methodenaufruf:
dauert ~ 5 - 50 MilliSec !!!
HelloInterface h = HelloFactory.lookup("myServer","myObject");
h.sayHello("HelloWorld");
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
4
RMI Architektur
Remote
Interface
Client
Application
RMI
Stub
Class
Remote
Object
Skeleton
Class
Remote Reference Layer
Transport Layer (JRMP)
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
5
HelloWorld mit RMI
RMI
Framework
generated
by RMIC
Developer
defined
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
6
Start des Hello Servers
public 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();
}
}© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
7
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 ...");
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
8
CORBA Architektur
Client
Application
IDL Stub
Class
(z.B. Java)
CORBA
Interface
IDL
Beschreibung
ORB
Interface
ORB
(z.B. Visigenic)
© Prof. Dr. Nikolaus Wulff
Corba Object
(Servant)
IIOP
TCP/IP
Web 2.0 Software-Architekturen
IDL Skeleton
Class
(z.B. C++)
ORB
(z.B. Iona Orbix)
9
HelloWorld mit CORBA
CORBA
Framework
generated
by IDLJ
Developer
defined
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
10
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);
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
11
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
...
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
12
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
13
EJB in a Nutshell
• EJBs laufen in einem ApplikationsServer und werden
von einem EJBContainer verwaltet.
EJB Server
EJB Container
EJB Home
Interface
EJB Bean
Client
EJB Remote
Interface
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
14
Die Schnittstellen im Überblick
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
15
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
16
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
17
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
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
18
EJB im J2EE Model
Client
Benutzer Interaktion
Applikationen, Applets, Browser
Präsentation
JSP, Servlets und andere UI
Business Ebene
EJBs und JavaBeans
Integrations Ebene
JMS, JDBC, Connectors und Legacy
Resourcen
Datenbanken und externe Systeme
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
Single signon,Sessionverwaltung,
Formatierung und Zustellung
Geschäftslogik, Transaktionen,
Daten und Services
Resource adapters, rule engine
und workflow, Altanwendungen
Daten und externe Dienste
19
J2EE Architektur
Web Container
Browser
HTTP
SSL
JSP
Application
Client Container
EJB Container
HTTP
SSL
JMS
JNDIJTA Java JDBC
Mail
RM I- IIOP
JAF
Application
Client,
Applet
JMS
JNDI JDBC
Servlet
J2SE
EJB
JMS
JNDIJTA Java JDBC
Mail
RM I- IIOP
JAF
Database
J2SE
RMI
RM I- IIOP
J2SE
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
20
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
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
21
EJB Typen
Logische Hierarchie
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
22
HelloWorld mit EJB
EJB
Framework
Developer
defined
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
23
EJB Client
public 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);
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
24
Einsatzbereich von EJBs
Je 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...
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
25
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
26
Stateless SessionBean
Does not Exist
Class.newInstance()
setSessionContext()
ejbCreate()
ejbRemove()
Method-Ready
Pool
business method
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
27
Stateful SessionBean
instance throws
system exception
Does not Exist
timeout
ejbRemove()
Class.newInstance()
setSessionContext()
ejbCreate()
timeout
ejbPassivate()
Passive
Method-Ready
ejbActivate()
business method
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
28
EntityBean
Does not Exist
Object.finalize()
unsetEntityContext()
ejbSelect()
Class.newInstance()
setEntityContext()
ejbFind()
Pooled
ejbPassivate()
ejbCreate()
ejbPostCreate()
ejbRemove()
Ready
ejbLoad()
ejbStore() BMP
business method
© Prof. Dr. Nikolaus Wulff
ejbActivate()
Web 2.0 Software-Architekturen
29
Message-Driven Bean
Does not Exist
Class.newInstance()
setMessageDrivenContext()
ejbCreate()
ejbRemove()
Method-Ready
Pool
onMessage()
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
30
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
31
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
32
ejbPostCreate Beispiel
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);
}
•
ShoppingCart wird bei der Erzeugung mit einer
lokalen UserBean assoziert.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
33
1:N Beziehung 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);
•
1:N Beziehung zwischen User und
ShoppingCard, notiert mit XDoclet.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
34
ShoppingCart getUser
/**
* @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);
}
}
• Der ShoppingCart User wird in der ejbCreateMethode als lokale Objekt gesetzt.
• Per getUser kann auf die lokale Instanz remote
zugegriffen werden...
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
35
Die Many Beziehung
/**
* @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);
• In der UserBean ist die many Relation hinterlegt
• JBoss generiert auch die Relationstabelle...
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
36
OQL Tabellen Generierung
/**
* @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"Web 2.0 Software-Architekturen
37
© Prof. Dr. Nikolaus Wulff
*
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
38
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
39
Bookstore Factory Methode
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);
}
}
• Zum Erzeugen einer ShoppingCart im Bookstore ist
eine lokale UserBean notwendig.
• Per findByPrimaryKey mit UserLocalHome...
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
40
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...
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
41
EJB3 Session Beans
• Annotations kennzeichnen den Life-Cycle.
• Meist wird ein Business Interface deklariet von
dem eine Lokal- und eine Remote-Schnittstelle abgeleitet werden die in einer POJO Bean implementiert 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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
42
Stateless Session Beispiel
/**
* Calculator service interface.
*/
public interface Calculator extends Serializable {
double calculate(double x, char op, double y);
}
@Remote
public interface CalculatorRemote extends Calculator {}
@Local
public interface CalculatorLocal extends Calculator {}
• Implementierung:
@Stateless
public class CalculatorBean implements CalculatorRemote,
CalculatorLocal {
@PostConstruct
protected void created() {
System.out.println("created " + this);
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
43
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(d
*/
@Test
public void additionTest() throws Exception {
double x = 2.3, y = 3.6;
assertEquals(x + y, service.calculate(x, '+', y), eps);
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
44
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
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
45
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;
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
46
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
47
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
48
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
49
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>
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
50
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;
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
51
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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
52
Hibernate JUnit Test Bootstrap
• Eine Hibernate Configuration wertet die hibernate.cfg
aus und erzeugt eine SessionFactory.
@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);
}
• Mit Hilfe der SessionFactory lassen sich Session(s)
und damit wiederum Transaction Instanzen erzeugen:
@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);
}
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
CRUD Semantik:
Commit
Rollback
Update
Delete
53
Zusammenfassung
• EJBs sind ein recht schwergewichtiges Architekturmodell. Das Vermischen von Verteilung und
Persistenz erwies sich für viele Projekte als zu kompliziert. 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.
© Prof. Dr. Nikolaus Wulff
Web 2.0 Software-Architekturen
54
Herunterladen