EJB 3.1 3.1 JPA 2.0 Java-Framework Autor Stephan Metzler About Coders geek & poke Version 4.1 © 2010 / 2011 i-ch223 >> Multi-User-Applikation objektorientiert realisieren >> Seite A B C D E F G H I J K L M N O P Q R S T U 5 39 45 61 109 129 143 161 169 189 207 221 229 253 281 431 445 449 465 473 507 Java Community Verteilte Systeme Java EE EJB Testen SLSB SFSB Singleton Messaging AOP Timer Service Web Service EJB Security Transaktionen JPA Idioms Regeln Deployment Deskriptoren Trends Projekt Referenzen 4. Tag 3. Tag 2. Tag 1. Tag MileStones © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 2 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> A Java Community Lerninhalte Technologien Entwurfsmuster Entwicklungtools Paradigmen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 3 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform 1 Java Plattform Die Java Plattform ist in drei Editionen aufgeteilt JME JSE JEE Micro Edition Standard Edition Enterprise Edition - Umgebung - robust - flexible - Ziel-Applikationen - embedded devices - Inhalt - JRE - Definition - Standard (Framework) - APIs - VM - - Mobil-Telefone - PDAs - Inhalt - VM - Kommunikationsprozesse JDK - JRE - Compiler - Debugger - Multi-User - Multi-Tier - Enterprise Appl. - Inhalt - Dienstleistungen - Zugriff Basis für JEE transparente Lösungen - Verhalten OOA / OOD Hilfreiche und wichtige Neuerungen im Java-Standard (seit JDK 1.5) - Annotations ►Metadaten im Source - Generics ►parametrischer Polymorphie Entwurfmuster - Dependency Injection ►Objekte erhalten ihre Abhängigkeiten passiv Paradigma - AOP Aspect Orientiertes Programmieren ►trennt System- von Businesslogik Tools im Umgang mit JEE Technologien - Maven ► Build-Management-Tool der Apache Software Foundation Log4J ► Loggen von Informationen ► Nachvollziehbarkeit / Wiederverwendbarkeit JUnit ►Test-Framework ► automatisiertes Testen Mock ► dynamisches (Dummy-) Test-Objekt ► Integrationstests © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 4 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform 1.1 Annotationen wiki Annotation bedeutet "Anmerkung", "Beifügung", "Hinzufügung". In diesem Sinn haben Annotationen bei Stichworten, Stichworten, Begriffsklärungen oder ausführlichen Texten den Charakter der Erklärung beziehungsweise Ergänzung. In der Softwareentwicklung dienen Annotationen dazu, Metadaten in den Quelltext eines Programms einzubinden. Diese haben keine direkte Auswirkung auf die Übersetzung des Quelltextes, bieten aber zusätzliche Möglichkeiten im Vergleich zu einfachen Kommentaren. Kommentaren. Eigenschaften - Metadaten direkt im Sourcecode - zentral - XML- oder Property-Dateien entfallen - mehrere Dateien sind z.T. umständlich - werden von Codegenerierungstools ausgelesen - Controlle bei der Entwicklung - werden zur Laufzeit per Reflection abgefragt - zur dynamischen Verwendung in Frameworks - Zuordnung zum Sourcecode ersichtlich - als Entwickler-Vorteil Verwendung von Annotations - Annotations werden im Sourcecode vor dem zu markierenden Element eingefügt - @ als Kennzeichnung vorangestellt - Leerzeichen sind erlaubt - Parameter als Name/Wert-Paar in Klammern an den Annotationsnamen angehängt @MyAnnotation(parameter1 = "hallo", parameter2 = "world") - Reihenfolge der Parameter spielt keine Rolle hat die Annotation nur einen Parameter, kann der Name weggelassen werden bei parameterlosen Annotations ist die Angabe der Klammern optional Annotations können sich auf folgende Java-Elemente beziehen: - Packages, Klassen, Interfaces, Enumerations, Methoden, Variablen, Methodenparameter © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 5 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Annotations in der Java JSE 5.0 - definiert sieben Annotations - Standard Annotation ►normale Verwendung beim Programmieren - Meta Annotation ►Definition neuer Annotationstypen Standard Annotations - @Deprecated - kennzeichnet Methoden und Klassen, die nicht mehr verwendet werden sollen - @Override - der Compiler stellt sicher, dass die Methode überschrieben wird - seit Java SE 1.5 für Superklassen ► Codesicherheit - seit Java SE 1.6 für Interfaces ► macht Business-Interfcae Pattern obsolet - @SuppressWarnings - unterdrücken Compilerwarnungen - Warnungen werden als Parameter angegeben Beispiel @Deprecated / @Override public class HelloWorld { @Deprecated public String sayHello() { return "Hello World"; } @Override public String toString() { return "Hello World"; } } - sayHello() ist "veraltet" und erzeugt Compilerwarnung - toString() mit @Override stellt sicher, dass toString() aus Object überschrieben wird © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 6 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Meta Annotations - @Documented - zur Erzeugung der Dokumentation bei Javadoc - @Inherited - Annotation-Typ wird vererbt - auch rekursiv - falls keine Annotation in der aktuellen Klasse gefunden wird - @Retention - Definiert wie lange die Annotation verfügbar ist - SOURCE ► stehen nur zur Compilerzeit zur Verfügung - CLASS (DEFAULT) ► werden in Class-Dateien abgespeichert, jedoch nicht von der VM geladen - RUNTIME ► werden in der Class-Datei abgelegt und von der VM geladen und stehen somit zur Auswertung per Reflection zur Verfügung - @Target - definiert Elemente (Klasse, Methode, Parameter etc.), denen eine Annotation zugeordnet werden kann Beispiel selbst definierter Annotation public enum Datentyp { TEXT, NUMMER, DATUM } @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Datenfeld { String bezeichnung() default ""; Datentyp datentyp() default Datentyp.TEXT; } - @Retention(RetentionPolicy.RUNTIME) definiert die Verfügbarkeit - RUNTIME : Auswertung zur Laufzeit - @Target({ElementType.FIELD}) definiert wo die Annotation eingesetzt werden kann - FIELD : für Attribute - @interface definiert das annotierte API Element "Datenfeld" - Parameter : Bezeichnung und Datentyp (sind optional und mit Default-Werten) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 7 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Anwendung: Klasse Person annotiert Attribute als Datenfelder public class Person implements java.io.Serializable { @Datenfeld(bezeichnung = "Nummer", datentyp = Datentyp.NUMMER) private int nr; @Datenfeld(bezeichnung = "Name", datentyp = Datentyp.TEXT) private String name; @Datenfeld private String beschreibung; } Auslesen der Annotationen Person p = new Person(); Field[] fields = p.getClass().getDeclaredFields(); for (Field field : fields) { Datenfeld datenfeld = field.getAnnotation(Datenfeld.class); if (datenfeld != null) { System.out.println("\nannotiertes Attribut: " + field.getName()); if (datenfeld.bezeichnung().length() != 0) { System.out.println("\tBEZ = " + datenfeld.bezeichnung()); } System.out.println("\tTYP = " + datenfeld.datentyp()); } Aufgabe ► selbstdefinierte Annotation - Testen Sie die Annotation @Datenfeld annotiertes Attribut: nr BEZ = Nummer TYP = NUMMER annotiertes Attribut: name BEZ = Name TYP = TEXT annotiertes Attribut: beschreibung TYP = TEXT © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 8 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform 1.2 Generics wiki In der Informatik sind Generische Typen Datentypen mit der Möglichkeit zur Angabe von Typparametern. Man spricht auch von parametrischer Polymorphie. Polymorphie. Ein generischer Typ erlaubt es, Datentypen zu erzeugen, die von den zu Grunde liegenden Typen abstrahieren. So würden eine Liste von Zahlen, eine Liste von Zeichen und eine Liste von Datumsangaben im Grunde auf dieselbe Weise programmiert werden. Die Algorithmen zum Einfügen, Suchen und Löschen würden würden stets gleich ablaufen. Es ist daher wünschenswert, die Implementierung der Liste unabhängig von diesen Typen vorzunehmen Eigenschaften - erlauben die Abstraktion von Typen - erlauben Wiederverwendbarkeit von Funktionalitäten - defineren generische Klassen und Methoden - unabhängig von einem konkreten Typ - definieren parametrische Polymorphie Generics verbessern verbessern die Lesbarkeit und helfen durch die erhöhte Typsicherheit die Zuverlässigkeit des Codes zu erhöhen. normale Collections List v = new Vector(); v.add(new Double(1.0)); Double d = (Double)v.get(0); - Cast auf Double ist notwendig, denn der Rückgabewert von get(...) ist Objekt - erlaubt inkompatible Typen in die Liste einzuführen generische Collections List<Double> v = new Vector<Double>(); v.add(new Double(1.0)); Double d = v.get(0); - v ist eine Liste von (nur) Double - Typ in spitzen Klammern definiert den konkreten Typparameter - Verwendung wird durch Compiler sichergestellt und zur Compilezeit erkannt - Casts entfallen, da Rückgabewert von get(...) nur Double ist - mehrere Typparameter werden durch Komma getrennt (z. B. Hashtable<Long, String>) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 9 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Wildcards und Bounds - unabhängiger Code - Implementierung von Such- oder Sortieralgorithmen - Wildcardzeichen ist ? - Vector<?> steht für einen Vector mit beliebigem Inhalt - Bounds als Angabe von Schranken - extends limitiert auf den angegebenen oder abgeleiteten Typ - super limitiert auf den angegebenen oder vererbten Typ Beispiel parametrisierter Polymorphie Vector<?> v1; Vector<String> v2 = new Vector<String>(); v1 = v2; // nur String List<? extends Number> 100; // Number oder Subtyp List<? super String> 2; // String oder Supertyp generische Typen - Generics sind nicht auf die Verwendung bestehender Klassen beschränkt - eigene generische Typen können definiert werden Definition der generischen Klasse MyGeneric - Enthält zwei Typparameter (K und V) - die Typparameter können wie normale Typen bei der Definition der Klasse verwendet werden public class MyGeneric<K, V> { private K key; private V value; public MyGeneric(K key, V value) { this.key = key; this.value = value; } public K getKey() { return key; } public V getValue() { return value; } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 10 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Aufgabe ► genererische Typen / generische Methoden - Typparameter wie normale Typen bei der Definition der Klasse verwenden @Test public void testMyGeneric() { K key = (K) "test"; V value = (V) (new Integer(123)); MyGeneric<K, V> myGeneric = new MyGeneric<K, V>(key, value); assertEquals(key, myGeneric.getKey()); assertEquals(value, myGeneric.getValue()); } - generische Methoden ► generische Methode sayHello(...) enthält zwei Typparameter public static <E, T> String sayHello(E pre, T post) { return (pre.toString() + " hello " + post.toString()); } @Test public void testSayHello() { assertEquals("generic hello world", sayHello("generic", new StringBuffer("world"))); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 11 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform 1.3 - Log4J populäre JAVA Logging-API http://logging.apache.org/log4j Vererbung von Loggern Logger-Hierachien erlauben feingranulare Kontrolle über Logausgaben Log-Anweisungen lassen sich durch Konfigurationsdateien ein- und ausschalten Komponenten - Loggers - sind <Named Entities> sind case sensitive folgen einer hierarchischen Namenskonvention - Layouts - erlauben das Formatieren der Logmeldungen - Appenders - erlaubt die parallele Ausgabe der Logmeldungen an verschiedene Ausgabemedien - z.B. Konsole, Dateien, GUI Komponenten, Sockets, JMS, etc. Logger wiki Ein Logger ist ein Vorfahre eines anderen Loggers, wenn sein Name, gefolgt von einem Punkt der Präfix des Namens eines Kind Loggers ist. Ein Logger ist ein Vater eines Kind Loggers, wenn es zwischen ihm und dem Nachkomme Logger keine weiteren Vorfahren gibt. Beispiel - Logger mit dem Namen <com.foo> ist Vater von <com.foo.Bar> - Logger mit dem Namen <java> ist ein Vater von <java.util> - Root-Logger (z.B. org) ist oberste Instanz - org.apache.log4j - einem Logger kann ein Level zugeordnet werden - DEBUG < INFO < WARN < ERROR < FATAL - Level sind in der Klasse org.apache.log4j.Level definiert - wenn einem Logger kein Level zugeordnet wurde, erbt er den Level Level Additivity Logger Level root root.x ERROR Geerbte Geerbter rbter Level ERROR © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 12 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Layouts ► erlauben das Formatieren der Loggermeldungen mit Pattern org.apache.log4j Pattern Zweck Category: Kategorie = Name org.apache Class = Klassennamen Date. Beispiel: %d{HH:mm:ss,SSS} Filename Location Information Line number Meldung selbst Methodennamen Line-Separator (Plattformabhängig) Priority: INFO, WARN, ERROR etc. Anzahl der Millisekunden seit dem Start der VM Name des Threads c C d F l L m M n p r t Beispiel %r [%t ] %-5p %c - %m%n 16 [main ] INFO log.SimpleLogging – entering Application Appenders - definiert Destinationen für Logger Meldungen - Konsolen, Dateien, GUI-Komponenten, JMS, etc. - Zuweisung eines Appenders durch die Methode addAppender - Appenders werden vereerbt Appender Additivity Logger Appender Target Vererbte Appenders root org org.apache org.apache.log4j A1 B1, B2 none C1 org und root org und root org.apache.log4j, org und root A1 A1, B1, B2 A1, B1, B2 A1, B1, B2, C1 Beispiel #set root logger level to DEBUG and define a appender 'file' log4j.rootLogger=DEBUG, file #set logging of package 'annotation' to Level WARN; inherits also appender 'file' log4j.logger.annotation=WARN © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 13 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Konfiguration ► durch PropertiesProperties-Datei ► log4j.properties #LEVELS: ALL > DEBUG > INFO > WARN > ERROR > FATAL > OFF #set root logger level to DEBUG and define a appender file log4j.rootLogger=DEBUG, file #set logging of package 'log' to Level WARN and define a appender L1 log4j.logger.log=INFO, L1 #set logging of package 'annotation' to Level WARN log4j.logger.annotation=WARN #L1 appender uses the Console with a Pattern log4j.appender.L1=org.apache.log4j.ConsoleAppender log4j.appender.L1.layout=org.apache.log4j.PatternLayout log4j.appender.L1.layout.ConversionPattern=%d %-5p [%t] %C{2} - %m\n #file appender uses a LOG File with a Pattern log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=log4j.log log4j.appender.file.MaxFileSize=100KB log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %-5p <%t> %F:%L - %m%n #file appender keeps one Backup File log4j.appender.file.MaxBackupIndex=1 Konfiguration ► durch XMLXML-Datei ► log4j.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j='http://jakarta.apache.org/log4j/'> <appender name="L1" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d %-5p [%t] %C{2} - %m\n" /> </layout> </appender> <root> <priority value="debug" /> <appender-ref ref="L1" /> </root> <logger name="annotation"> <level value="warn" /> </logger> </log4j:configuration> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 14 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Aufgabe ►Log4J - fügen Sie Ihren Projekten eine Log4J Datei hinzu - testen Sie die verschiedenen Loggers, Layouts und Appenders definieren Sie eine Output Datei für die DEBUG Meldungen Ansatz ► SimpleLogger.class public class SimpleLogger { static Logger logger = Logger.getLogger(SimpleLogging.class.getName()); public static void main(String[] args) { // configures Logger from log4j.properties or from log4j.xml PropertyConfigurator.configure("properties/log4j.properties"); PropertyConfigurator.configure("log4j/log4j.xml"); logger.info("entering Application"); Person p = new Person(); p.doIt(); logger.info("leaving Application"); } } Ansatz ► loggen von Person.class public class Person implements java.io.Serializable { static Logger logger = Logger.getLogger(Person.class); public Person(){ logger.info("Person konstructed!"); } public void doIt() { logger.warn("did it again!"); } } Output auf der Konsole 2010-01-01 12:00:00,781 INFO 2010-01-01 12:00:00,781 INFO [main] log.SimpleLogging - entering Application [main] log.SimpleLogging - leaving Application File ► log4j.log 2010-01-01 12:00:00,234 INFO 2010-01-01 12:00:00,234 WARN 2010-01-01 12:00:00,234 INFO <main> SimpleLogging.java:20 - entering Application <main> Person.java:20 - did it again! <main> SimpleLogging.java:23 - leaving Application © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 15 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform 1.4 Project Lombok - Code Generator ► http://projectlombok.org/ - umgeht Java Konventionenfür JavaBeans - definieren des Default Konstruktors - generieren von getter / setter - überschreiben von toString / equals / hashcode - Plugin für Eclipse ► http://projectlombok.googlecode.com/files/lombok.jar - ausführbare Datei ► als JAR ausführen - lombok.jar in den Project ClassPath einbinden import lombok.Data; @Data public class Konto { private String nr; private String name; private Float saldo; } Lombok Annotations Annotation Verwendung generiert getter und setter Methoden der verwendeten Attributen @Getter / @Setter @ToString generiert entsprechende toString Methode @EqualsAndHashCode generiert equals und hashCode Methoden generiert Konstruktorenen @NoArgsConstructor @RequiredArgsConstructor Default Konstruktor ohne Argumente Konstruktoren für final / alle Attrbute @AllArgsConstructor @Data generiert Artefakte für ein Data Objekt @ToString, @EqualsAndHashCode, @Getter für alle Attribute, @Setter für non-final Attribute, und @RequiredArgsConstructor @Cleanup automatisches Ressourcenmanagment @Synchronized synchronisiert statische und Klassen-Methoden @SneakyThrows übergeht checked exceptions © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 16 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform 1.5 Build Tools wiki Erstellungsprozess oder BuildBuild-Prozess (von englisch to build „bauen“) bezeichnet in der Programmierung Programmierung einen Vorgang, durch den ein fertiges Anwendungsprogramm automatisch erzeugt wird. verbreitete Programme zur Durchführung von Erstellungsprozessen - Unix - make, CMake, Automake - Java - Apache Ant ► http://ant.apache.org/ - Apache Maven ► http://maven.apache.org/ - Buildroot ► http://buildroot.uclibc.org/ - .Net - TFS (Team Foundation Server) ► http://msdn.microsoft.com/en-us/vstudio 1.5.1 Maven wiki Maven ist ein BuildBuild-ManagementManagement-Tool der Apache Software Foundation und basiert auf Java. Java. Mit ihm kann man insbesondere insbesondere JavaJava-Programme standardisiert erstellen und verwalten. Eigenschaften - bildet "Convention over Configuration" für gesamten Zyklus der Softwareerstellung ab - automatisiert die Prozesse der Entwicklung - Kompilieren - Testen - Packen - Deployen - definiert vorgegebene Standards - braucht wenige Konfigurationseinstellungen - vereinfacht Aufgaben des Build-Managements - bildet den Lebenszyklus eines Softwareprojekts ab © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 17 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform Maven Softwareentwicklung folgt einem vordefinierten Zyklus - validate ► Validieren - prüft ob die Projektstruktur gültig und vollständig ist - compile ► Kompilieren - kompiliert den Quellcode - test ► Testen - testet den kompilierten Code mit einem passenden Testframework (z.B. JUnit) - package ► Verpacken - der kompilierte Code wird mit nichtkompilierbaren Dateien zur Weitergabe verpackt (z.B. JAR) - integration-test ► Test der Integrationsmöglichkeit - Softwarepaket wird auf eine Umgebung (z.B. Server) geladen und seine Funktionsfähigkeit geprüft - verify ► Gültigkeitsprüfung des Software-Pakets - prüfen ob das Softwarepaket eine gültige Struktur und bestimmte Qualitätskriterien erfüllt - install ► Installieren im lokalen Maven-Repository - installiert das Softwarepaket in dem lokalen Maven-Repository (z.B. für modulare Projekte) - deploy ► Installieren im entfernten Maven-Repository - installiert das Softwarepaket auf einem entfernten Maven-Repository (Wiederverwendbarkeit) Konfigurationsdatei http://maven.apache.org/pom.html - als XML-Datei mit dem Dateinamen pom.xml (für Project Object Model) - enthält alle Informationen zum Softwareprojekt - standardisiertes Format / Dateistruktur - Abhängigkeiten - Informationen für Plugins - Produkteinformationen - aktuelle Version Beispiel - Abhängigkeiten von JUnit Framework laden <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.4</version> <scope>test</scope> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 18 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform konventioniertes Standard-Verzeichnisstruktur - vereinfacht die zentrale Konfigurationsdatei pom.xml - Softwareprojekt soll sich an folgende Struktur halten - src/main - Eingabedateien für Erstellung des eigentlichen Produkts - src/main/java - Java-Quelltext - src/main/resources - Dateien für die Übersetzung oder zur Laufzeit z.B. Properties-Dateien - src/test - Eingabedateien für automatisierte Testläufe - src/test/java - JUnit-Testfälle für automatisierte Tests - target/classes - kompilierte Java-Klassen Auflösung von Abhängigkeiten als zentrale Repositories - in der pom.xml werden Softwareabhängigkeiten angegeben - diese Abhängigkeiten werden aufgelöst - Maven ermittelt, ob die benötigten Dateien in einem lokalen Verzeichnis bereits vorhanden sind - oder Maven versucht, sich mit einem konfigurierten Maven-Repository im Intranet zu verbinden - oder Maven versucht, sich mit einem konfigurierten Maven-Repository im Internet zu verbinden - Abhängigkeiten werden in das lokale Repository kopiert - Bekannte öffentliche Maven-Repositories http://mvnrepository.com/ - Apache - Ibiblio - Codehouse - Java.Net - Firmenweite Maven-Repositories stellen Bibliotheken und Frameworks zur Verfügung - Archiva, Artifactory, Proximity - Codehaus Maven Proxy - Dead Simple Maven Proxy © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 19 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java Plattform B Verteilte Systeme Lerninhalte Eigenschaften Technologien - Corba DCOM .NET EJB © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 20 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Verteilte Systeme 2 Verteilte Systeme - auf mehreren Prozessen verteilt - kommunizieren mittels Nachrichtenaustausch Eigenschaften - gemeinsame Nutzung von Ressourcen - zuverlässige und konstante Zugriffszeit - Offenheit - Erweiterbarkeit des Systems (Hardware, Software) - Standardisierung von Schnittstellen - Interprozesskommunikation heterogene HW- und SW- Komponenten - Skalierbarkeit - ohne Änderungen der System- oder Anwendungssoftware - Fehlertoleranz - Hardwareredundanz - Softwareredundanz 2.1 Technologien für Verteilte Systeme CORBA ► Common Object Request Broker Architecture - plattform- und sprachunabhängig - nur "basic distribution" DCOM ► Distributed Component Object Model - Dienste zur Kommunikation zwischen Prozessen - Microsoft - CORBA-DCOM Bridge © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 21 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Verteilte Systeme .NET Microsoft http://de.wiki.org/wiki/.NET - sprach- und (plattform-) unabhängig löst Component Object Model ab fokussiert auf Client (Services) auch PDA (Personal Digital Assistant) seit Januar 2008 OpenSource CLR ist die Laufzeitumgebung - CLR = Common Language Runtime Interpreter für den standardisierten Zwischencode - CLI ist der Zwischencode - CLI = Common Intermediate Language EJB Enterprise Java Beans http://de.wiki.org/wiki/Enterprise_JavaBeans - nur JAVA http://java.sun.com/javaee - entwickelt für Geschäftsprozesse - keine Systemroutinen - integrierte Verbindungslogik - verteilt = unterschiedlicher VM's - standardisierte Komponenten - erlauben transparente Entwicklung - vereinfachte Entwicklung - Sicherheit - rollenbasierter Zugriff auf Methodenebene - Transaktionen - durch Container verwaltet - Kommunikation - synchron / asynchron © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 22 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Verteilte Systeme C Java EE Lerninhalte Plattform Spezifikation Architektur Einsatzgebiete Komponenten © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 23 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform 3 Java EE Plattform http://java.sun.com/javaee/5/docs/tutorial/doc/ Spezifikation - JEE ist die Spezifikation einer Softwarearchitektur - JEE bezeichnet ein Applikationsframework, ausgelegt auf - Performance - Skalierbarkeit - Plattformunabhängigkeit Eigenschaften - sauber implementierte Trennung zwischen Tiers - dadurch weitgehende Unabhängigkeit © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 24 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform 3.1 Application Server wiki Ein Anwendungsserver ist ein Server in einem Computernetzwerk, Computernetzwerk, auf dem AnwendungsAnwendungsprogramme ausgeführt werden. Im engeren Sinne bezeichnet der Begriff eine Software, Software, die spezielle Dienste zur Verfügung stellt, wie beispielsweise Transaktionen, Transaktionen, Authentifi Authentifizierung fizierung oder den Zugriff auf Verzeichnisdienste und Datenbanken über definierte Schnittstellen. Schnittstellen. JEE Anwendungserver beinhaltet - Components - Applets, Servlets, Enterprise Java Beans - Containers - Web Browsers, Servlet Engines, EJB Containers - Resources - SQL Datenquellen, Nachrichtensysteme, Mailsysteme 3.2 History History der Java Enterprise Edition http://de.wikipedia.org/wiki/Java_Platform,_Enterprise_Edition Robustheit J2EE 1.3 J2EE 1.2 JPE Project Java Plattform for the Enterprise 1998 Servlet /JSP EJB 1.0 JMS 1.1 JTA 1.0 JAAS 1.0 JNDI RMI/IIOP 1999 EJB 2.0 2001 Web Services J2EE 1.4 EJB 2.1 JSS 2.4 JSP 2.0 WS 1.0 JavaMail 1.2 JAXP 1.2 JCA 1.5 2003 SOA Java EE 5 EJB 3.0 JPA 1.0 JSS 2.5 JSP 2.1 JSF 1.2 WS 1.2 JavaMail 1.4 JAXB 2.0 JAXP 1.3 JAX-WS 2.0 StAX 1.0 JSTL 1.2 Java EE 6 2006 2010 EJB 3.1 JPA 2.0 JSS 3.0 JSF 2.0 Bean Validation © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 25 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform 3.3 Features - EJB Enterprise Java Beans - beinhalten die Geschäftslogik einer Enterprise Anwendung - gestatten Zugriff auf persistente Daten - die Beans laufen in einem EJB-Container - Session-Beans, implementieren die Geschäftslogik und sind meistens vom Client zugreifbar - Message-Driven-Beans, für die Verarbeitung von JMS-Nachrichten - Entity-Beans für die Abbildung von persistenten Datenobjekten - JSS Java Servlet API - Erweiterung von Servern, deren Protokoll auf Anfragen und Antworten basiert - JSP JavaServer Pages - Textdokumente, bestehen aus statischem Text und dynamischen Textelementen - WS Web Services - definieren Schnittstellen zu EJBs, die durch den URI eindeutig identifizierbar sind - JNDI Java Naming and Directory Interface - gemeinsame Schnittstelle mit der Klassen auf Namens- und Verzeichnisdienste zugreifen können - JMS Java Message Service - ist API für die asynchrone Nachrichtenverarbeitung - JTA Java Transaction API - erlaubt der Anwendung die Steuerung der Transaktionsverwaltung - ist die Java-Schnittstelle zu Transaktionsmonitoren, z.B. Java Transaction Service (JTS) - JAAS Java Authentication and Authorization Service - eine Java-API um Dienste zur Authentifikation und Zugriffsrechte bereitzustellen - implementiert ein Standard-"Pluggable Authentication Module" (PAM) - JavaMail JavaMail - erlaubt den Zugriff auf Mail Services, wie z.B. SMTP, POP3, IMAP oder NNTP - JAXB Java Architecture for XML Binding - ermöglicht es, ein XML-Schema direkt an Java-Klassen zu binden - JAXP Java API for XML Processing - hilft bei der Bearbeitung von XML-Dokumenten - JAX-RPC Java API for XML-Based Remote Procedure Calls - ermöglicht den entfernten Zugriff auf RPC-Dienste - JACC Java Authorization Contract for Containers - definiert diverse Sicherheitsrichtlinien für die diversen Java-EE-Container - JCA J2EE Connector Architecture - dient dazu, andere Systeme transparent zu integrieren © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 26 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform - JAF JavaBeans Activation Framework - bietet die Möglichkeit, verschiedene Daten anhand des MIME-Headers zu erkennen - JAX-WS Java API for XML Web Services - hilft bei der Erstellung von Web Services und zugehörigen Clients, die über XML kommunizieren, z. B. über SOAP - JPA Java Persistence API - stellt eine einheitliche und datenbankunabhängige Schnittstelle für Object-Relational-Mapping und das Arbeiten mit Entitäten bereit - StAX Streaming API for XML - cursor-basierte XML-Verarbeitung in Ergänzung der DOM- und SAX-Parser - JSF Java Server Faces - Mit Hilfe von JSF kann der Entwickler auf einfache Art und Weise Komponenten für Benutzerschnittstellen in Webseiten einbinden und die Navigation definieren - JSTL JavaServer Pages Standard Tag Library - Sammlung von JSP-Tags für die Strukturierung, XML, SQL, Internationalisierung usw. Deployment Deskriptoren wiki Ein Deployment Descriptor (frei übersetzt "Einsatzbeschreibung") ist eine Konfigurationsdatei im Format XML. XML. Im Umfeld der Java Platform, Enterprise Edition, Edition, beschreibt diese Konfigurationsdatei den spezifischen Bereitstellungsprozess Bereitstellungsprozess (englisch deployment) deployment) und dazu benötigte Informationen. Informationen. - sind eine der Stärken von JEE - jedoch nur durch Tools sinnvoll einsetzbar ► IDE, Xdoclet, etc. - Grundlage durch JEE Rollenverständnis - Component Developer - Assembler - Deployer - dynamisches Verhalten der Komponenten - Applikationserver muss nicht neu gestartet werden - Komponente muss nicht neu deployed werden - schnell grosse Komplexität - ist oft Migrationshindernis © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 27 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform 3.4 Einsatzgebiete In den folgenden Gebieten finden JEE Applikationen ihren Schwerpunkt: - Datenbankzugriff - Trennen der Anwnderschwerpunkte - dynamische Internetseiten - Bereitstellen der Logikkomponenten - Enterprise JavaBeans - als fachliche Domänenklassen - Middle-Tier Server - als feingranulare Architektur - plattformenabhängige Kommunikation - durch definierte Protokolle - Sicherheit - durch übergeordnete Architekturlayer 3.5 Architektur - Komponenten sind funktionelle Einheiten - werden zu einer Komponenten-Architektur zusammengefasst Die folgenden Core Technologien dominieren: - JNDI (Java Naming and Directory Interface) - Zugriff auf "naming" und "directory" Systeme wie LDAP, DNS, etc. - JTA (Java Transaktion API) - Zugriff auf Transaction Systeme wie BEA Tuxedo, etc. ORACLE - JDBC (Java DataBase Connectivity) - Zugriff zu relationalen Datenbanken - JMS (Java Messaging Service ) - Zugriff zu Message Orientated Middleware, z.B. iBus ,IBM MQSeries DB2 JDBC Tuxedo JTA JEE JNDI LDAP DNS COS JMS MQSeries iBus © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 28 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform 3.6 Konventionen wiki Eine Konvention (lat. (lat. conventio „Übereinkunft, Zusammenkunft“) Zusammenkunft“) ist eine nicht formal festgeschriebene festgeschriebene Regel, Regel, die von einer Gruppe von Menschen aufgrund eines Konsens eingehalten wird. - Namenskonventionen seit JSR 220 nicht mehr so dominant - orientieren sich am Namensmodell von SUN™ ► http://www.oracle.com/technetwork/java/codeconv-138413.html Ansatz basierend auf dem HelloWorld EJB EJB Namens Konvention Item Syntax <name>Bean Enterprise Bean Name (DD) <name>JAR EJB JAR Display Name (DD) <name>Bean Enterprise Bean Class <name> Business Interface <name>Remote Remote Interface <name>Local Local Interface <name> Abstract Schema (DD) 3.7 Beispiel HelloWorldBean HelloWorldJAR HelloWorldBean HelloWorld HelloWorldRemote HelloWorldLocal HelloWorld Komponenten ► funktionierende Software Einheit wiki Eine SoftwareSoftware-Komponente ist ein SoftwareSoftware-Element, das konform zu einem Komponentenmodell ist und gemäss einem CompositionComposition-Standard ohne Änderungen mit anderen Komponenten verknüpft und ausgeführt werden kann. - eine Komponenten ist eine funktionierende Software Einheit - über einen JEE-Server Clients zur Verfügung gestellt Bestandteile - als *.ear Datei (eenterprise archive) gepackt ar - Enterprise Beans ► *.jar Datei (java archive) - eine oder mehrere Enterprise Beans - WEB-Anwendungen ► *.war Datei (web application archive) - HTML-Seiten, Servlets, JSP, Bilder - Client-Anwendungen ► *.jar Datei (java archive) - Stand-Alone Java Applikation - Deployment Descriptors ► *.xml, optionale für jede Komponente - XML-Dokumente zur Integrationsbeschreibung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 29 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform 3.8 Enterprise Archive - folgt standardisierter Struktur - ermöglicht dem Applikationsserver das Entpacken der Komponenten - erlaubt das Deployen der JEE Applikation - in einem EAR-Archiv Java SE - EJBs sind in einem WAR deployed - 3.9 als JAR-Archive - in WEB-INF/classes Verteilte Multi-Tier Applikationen - das Verteilen der Applikation definiert der SoC (Separation of Concerns) Aspekt der OOA (Object-Orientated Analysis) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 30 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Java EE Plattform D EJB Lerninhalte Definition Architektur Typen Bestandteile (Entwicklungs-)Szenarien (Entwicklungs-)Rollen Zugriff Kommunikationsmodell © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 31 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Enterprise JavaBeans 4 Enterprise JavaBeans EJBs sind als Komponenten konzipiert: - wiederverwendbar - verteilt einsetzbar - lose gekoppelt SoC (Separation of Concerns) ermöglicht: - Trennung der Anwendung (Geschäftslogik) - Bedienerführung (Darstellungslogik) - Datenerhaltung (Persistenz) EJB Technologie definiert: - Interfaces - Patterns - Richtlinien für Komponenten-orientierte, verteilte Systeme. 4.1 Definition Development, Entwicklung, Distribution Verteilung and und Deployment of Umsetzung (von Modellen) Militär: Truppenbereitstellung / Installation Java-Based Java basierten Server-Side serverseitigen Software Components Software Komponenten © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 32 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Enterprise JavaBeans EJB Komponente - definiert Funktionalität Black Box Zugriff nur über Schnittstelle Wiederverwendbarkeit http://www.ejip.net/images/ejb.jpg EJB Ziele - Entwicklung von Geschäftsprozessen - keine Systemprozesse - Standard für Komponenten-basierte Entwicklung - Wiederverwendbarkeit 4.1.1 POJO Plain old Java Object wiki POJO ist eine Abkürzung für Plain Old Java Java Object, Object, also ein „ganz normales“ Objekt in der Programmiersprache Java. Java. - ist ein Java-Objekt ohne Einschränkungen - bis auf die der Java Language Specification - ein POJO sollte keine - vorspezifizierte Klasse erweitern - z. B. public class Foo extends javax.servlet.http.HttpServlet - vorspezifiziertes Interface implementieren - wie z. B. public class Bar implements javax.ejb.EntityBean - vorspezifizierte Annotation enthalten - wie z. B. @javax.ejb.Entity public class Person Beispiel - Klasse Person © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 33 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Enterprise JavaBeans seit Version 3 ist das EJB ein POJO Dependency Injection JPA Query Language Bean Ressourcen Annotaions Stateless Stateful Session Bean Entity Bean O / R Mapping Transactions Remote Invocation JDBC JNDI JTA Message Driven Bean Container Ressourcen POJO Plain Old Java Object Bean Container 4.2 Architektur - Applikationsserver definiert Lebensraum für Anwendungsprogramme ► Container - bietet Kommunikationsschittstelle - RMI - SOAP ► WebService - stellt Dienste zur Verfügung - Transaktionsunterstützung - Verteilung - Replikation - Namensdienste - Datenbankanbindung - Sicherheitsdienste EJBs existieren innerhalb innerhalb von Container © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 34 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Enterprise JavaBeans 4.3 Typen - Session Bean - SLSB Stateless Session Bean ► zustandslose Multitask / Multithread Komponente - SFSB Statefull Session Bean ► Client Session im verteilten Multi-User Umfeld - Singleton Bean - unique Instanz einer EJB ► innerhalb der Anwendung - Message Driven Bean - asynchrone Komponente im verteilten Multi-User Umfeld - Entity Bean - modelliert persistente Daten Eigenschaften Session Bean Singleton Message Driven Driven Bean Entity Bean Zweck Stellt einen Prozess für einen Client dar, z.B. Geldautomat Stellt einen uniquen Prozess zur Verfügung. Stellt einen Nachrichtenempfänger dar. Stellt Daten dar. Entitäten oder Objekte im persistenten Speicher (DB) Ausprägung Ausprägung Stateless Session Bean Stateful SessionBean Singleton Message Driven Bean Entity Bean Singleton hat keine Client Zuordnung, jedoch eine unique Zuordnung in der Applikation keine direkte Clientzuordnung, "horcht" auf einen JMS-Kanal Gemeinsame Nutzung durch mehrere Clients möglich Transient Lebenszyklus typischerweise durch Clientprozess bestimmt Transient "stirbt" bei Container Terminisierung Persistent Zustand bleibt im persistenten Speicher (DB) auch nach Container Terminierung erhalten Stateful Session Bean dedizierte Client Zuordnung Gemeinsame Nutzung Stateless Session Bean hat keine Client Zuordnung Persistenz Transient Lebenszyklus typischerweise durch Clientprozess bestimmt © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 35 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Enterprise JavaBeans 4.4 Bestandteile - Bean Implementierung - definiert und implementiert alle Methoden, die in den Interfaces deklariert sind - Local Interfcae - definiert Zugriff (Interface) für einen lokalen Client (EJB im Container) - Remote Interface - definiert Zugriff (Business Interface), für einen remote Client - Web-Service Interface - definiert Zugriff als Web Service Deployment Descriptor - XML Datei zur Beschreibung der Komponente - Dateiangaben Pfadangaben Datenbankverbindungen Verhalten - Zugriffskontrolle - Transaktionsverhalten Java ARchive (Datei mit der Endung .jar) Local Interface Remote (Business) Interface Bean Implementation Deployment Descriptor © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 36 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hello EJB3 World 5 Hello EJB3 World Aufbau, Installieren und Betreiben einer JEE Applikation. 5.1 Voraussetzungen - JSDK: Java Software Development Kit (min. Version 1.5) - http://www.oracle.com/technetwork/java/javase/downloads/index.html - JEE Application Server - http://de.wikipedia.org/wiki/Liste_von_Anwendungsservern - Sun GlassFish ► https://glassfish.dev.java.net/public/downloadsindex.html - JBoss ► http://jboss.org/jbossas/downloads/ Open Source - OpenJPA ► http://openjpa.apache.org/downloads.html - Apache Geronimo - Geronimo ► http://geronimo.apache.org/downloads.html - Glassfish ► Referenzimplementierung - JBoss Application Server - Resign ► http://www.caucho.com/download/ Closed Source - WebShere - Entwicklingsumgebung - Oracle Application Server - Eclipse ► http://www.eclipse.org/downloads/ - WebLogic - NetBeans ► http://netbeans.org/downloads/ - SAP NetWeaver Application Server - BlueJ ► http://www.bluej.org/download/download.html 5.2 Organisation - /ejbModule - /server - Source der Middle Tier ► EJB - /META-INF - Deployment Descriptor ► ejb-jar.xml - /properties - Eigenschaftsdateien - /test - /junit - Remote Unit-Test - /remote - Remote Application-Client Umgebungsvariablen - Systemvariablen definieren / ergänzen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 37 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hello EJB3 World 5.3 Ziel HelloWorld.jar 1. - META-INF - MANIFEST.MF - ejb-jar.xml -server - HelloWorld.class - HelloWorldBean.class JEE Application Server Plattform 2. HelloWorld.jar HelloWorld.jar 3. deployen deployen 4. TestHelloWorldBean TestHelloWorldBean.class HelloWorldBean.class 5.4 Hello EJB World Java Source Dateien - das Remote (Business) Interface - im Verzeichnis HelloWorld.java <workspace>\HelloWorld\ejbModule\server package server; import javax.ejb.*; @Remote public interface HelloWorld { public String echo(String echo); } - die Enterprise BEAN Klasse - im Verzeichnis HelloWorldBean.java <workspace>\HelloWorld\ejbModule\server package server; import javax.ejb.*; @Stateless public class HelloWorldBean implements HelloWorld { @Override public String echo(String echo) { return "Server Echo : " + echo; } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 38 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hello EJB3 World - die Client Applikations-Klasse - im Verzeichnis HelloWorldBeanClient.java <workspace>\HelloWorld\test\remote package remote; import import import import javax.naming.Context; javax.naming.InitialContext; javax.naming.NamingException; javax.rmi.PortableRemoteObject; import server.HelloWorld; public class HelloWorldBeanClient { public static void main(String[] args) { try { HelloWorld hello = null; Context ctx = new InitialContext(); Object o = ctx.lookup("HelloWorldBean/remote"); hello = (HelloWorld) PortableRemoteObject.narrow(o,HelloWorld.class); System.out.println(hello.echo("Hello EJB3 World")); } catch (NamingException e) { e.printStackTrace(); } } } Bekanntmachen der Serveradresse - als VM Argumente ► Abhängigkeit durch Entwicklungsumgebung - Eclispe - Run Configurations... - als Systemparameter ► Abhängigkeit durch Sourcecode System.setProperty("java.naming.factory.initial","org.jnp.interfaces.NamingContextFactory"); System.setProperty("java.naming.provider.url","jnp://localhost:1099"); - den InitialContext parametrisieren ► Abhängigkeit durch Sourcecode Properties properties = new Properties(); properties.setProperty( Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); properties.setProperty( Context.PROVIDER_URL, "jnp://localhost:1099"); initialContext = new InitialContext(properties); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 39 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hello EJB3 World - als Property-Datei laden ► Datei lesen ist teuer (zeitaufwändig) Properties properties = new Properties(); File jndiPropertyFile= new File("properties/jndi.properties"); properties.load(new FileInputStream(jndiPropertyFile)); - als Property Datei im ClassPath ► lose gekoppelt ► sinnvoll - java.naming.factory.initial - Initialisierungsklasse der Factory für den Namensdienst / JNDI Treiber - java.naming.factory.url.pkgs - Package, in dem sich die Init-Klassen befinden - java.naming.provider.url - Adresse des JNDI-Servers properties/jndi.properties java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces java.naming.provider.url=localhost:1099 Aufgabe ► Remote Zugriff - testen Sie die verschiedenen Strategien zum Laden der Server-Properties Aufgabe ► Proxy Object - Geben Sie die Klasse und das Interface des Proxy aus // zeigt Klassen und Interfaces System.out.println("CLASS > " + o.getClass().getName()); Class[] interfaces = o.getClass().getInterfaces(); for (int i = 0; i < interfaces.length; ++i) { System.out.println("implements > " + interfaces[i].getName()); } - Testen Sie alternative Instazierungen des Proxyobjekt // Instanziierung des Business Interface durch ProxyObject hello = (HelloWorld) o; // Instanziierung des Business Interface durch NamingContext hello = (HelloWorld) ctx.lookup(o.getClass().getName()); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 40 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hello EJB3 World Aufgabe ► JNDI - Prüfen Sie die registrierten Nameneinträge des JNDI - http://localhost:8080/jmx-console + service=JNDIView Deployment Descriptor ► ejbejb-jar.xml - als Alternative zu Annotationen - Datei ► <workspace>\HelloWorld\ejbModule\META-INF\ejb-jar.xml <?xml version="1.0" encoding="UTF-8"?> <javaee:ejb-jar version="3.1" xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_1.xsd "> <javaee:enterprise-beans> <javaee:session> <javaee:ejb-name>HelloWorldBean</javaee:ejb-name> <javaee:business-remote>server.HelloWorld</javaee:business-remote> <javaee:ejb-class>server.HelloWorldBean</javaee:ejb-class> <javaee:session-type>Stateless</javaee:session-type> </javaee:session> </javaee:enterprise-beans> </javaee:ejb-jar> Deployme Deploymentnt-Descriptor überschreibt Annotationen Annotationen! tationen! © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 41 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hello EJB3 World Aufgabe ► ejbejb-jar.xml - testen Sie das HelloWorldBean mit einem ejb-jar.xml Deploymentdescriptor - überschreiben Sie den JNDI Namen durch eine JBoss propretäre XML Datei - Datei ► <workspace>\HelloWorld\ejbModule\META-INF\jboss.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss PUBLIC "-//JBoss//DTD JBOSS 3.0//EN" "http://www.jboss.org/j2ee/dtd/jboss_5_0.dtd"> <jboss> <enterprise-beans> <session> <ejb-name>HelloWorldBean</ejb-name> <jndi-name>ejb/hello/remote</jndi-name> </session> </enterprise-beans> </jboss> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 42 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6 Inside EJB3 - Elemente der EJB-Architektur ►Zusammenspiel der fachlichen Komponeneten - Szenarien und Rollen ► Entwickeln und Bereitstellen der fachlichen Komponenten 6.1 Elemente der EJB-Architektur Die wichtigsten Elemente und ihre wesentlichsten Aufgaben: 6.1.1 Java EE Server - Gewährleistung von - Skalierbarkeit - Verfügbarkeit - Verbindungs-Management - Lastausgleich - Fehler-Management - Thread- und Prozessmanagement - Unterstützung von Clustering - Integration von Middleware Diensten - Verwalten von System Ressourcen 6.1.2 Aufgaben des EJB Container - stellt die deployten Komponenten zur Verfügung - definiert Laufzeitumgebung - standardisierter Zugang zu den Services ► JTA, JPA, JNDI, JMS, etc. - Instanzen Verwaltung ► Session Management - life cycle management ► auch pooling - Ausführen von Callback Methoden - Aufrufen von Interceptoren Klassen / Methoden - Remote Zugriff - unterstützt Rechner- und Prozessübergreifende Komponentenaufrufe - für standardisierte Protokolle - Sicherheit - Authorisierung von Komponentenzugriffen - deklarativ - rollenbasiert © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 43 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 - Persistenz - JDBC Anbindung - Java Persistence API - Transaktionen - 2PC ► Two Phase Commit - distributet Transactions - CMT ► Container Managed Transaction - BMT ► Bean Managed Transaction - Namens- und Verzeichnisdienst - JNDI (Java Naming and Directory Interface) - Environment- und Komponenten Information - durch lokales Verzeichnis - Messaging - JMS-API (Java Message Service) - asynchroner Nachrichtenaustausch 6.1.3 Enterprise Beans - Server Komponenten - kapseln die Geschäftslogik Ausprägungen - Session Beans - Abbildung der Use Cases - beinhalten Logik - definieren Workflow - Message Driven Beans - verarbeiten asynchron empfangene Nachrichten - Entity Beans - definieren persistente Objekte der JPA - Java Persistence API © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 44 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.1.4 Deployment Descriptor - ist eine XML (eX Xtensible Markup Language) Datei - beschreibt die Deploymenteigenschaften - beeinflusst die Entwicklungslevel (Rollen) Deployment Descriptor Beschreibungskriterien - wie das Bean installiert werden muss - das Deployment (Installieren / Bereitstellen) - die EJB Implementation / Interfaces - Verbindungen zu anderen Quellen - EJB DB - die Umgebung des Beans - lose gekoppelt - konfigurierbar - Transaktionsvariablen ► Transactions Attributes - Sicherheitsvariablen ► Access Control Lists 6.2 Szenarien und Rollen - Client-Szenarien ► Zugriff auf die fachlichen Komponeneten - Entwickler-Szenarien ► Bereitstellen der fachlichen Komponeneten 6.2.1 Clients - EJBs - transparent - thin - browser basiert - fat - Java - .NET - CORBA - unabhängig - protokolliert - z.B. Webservice, REST, etc. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 45 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.2.2 Rollen - mögliche Szenarien streben nach - Trennung der verschiedenen Schichten - Robustheit - parallele Entwicklungsprozesse - resultiert in Rollen durch Aufgabenteilung - EJB Provider - besitzt Wissen im Anwendungsbereich - entwickelt die Bean Komponenten - Application Assembler - verbindet die EJB Komponenten zu einer konkreten Anwendung - EJB Deployer - installiert die Applikation (Deployment Unit) in den EJB Container - Server / Container Provider - Hersteller eines JEE Servers, z.B. Sun, BEA, IBM, Borland, JBoss, etc.) - Container Provider stellt die Laufzeitumgebung für EJBs zur Verfügung - Systemadministrator - administriert Gesamtsystem, OS, JEE-Server, etc. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 46 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.3 Zugriff auf ein EJB - EJBs erlaubten den Remote Zugriff mit Hilfe von zwei Java-EE-Technologien - JNDI, Zugriff auf einen Namens- und Verzeichnisdienst - RMI-IIOP, Protokoll für den entfernten Methodenaufruf - Client Zugriff - Funktionalität von EJBs ist über öffentlichen Methoden des Business Interfaces zugänglich - als Proxy Objekt (Business Interface Referenz) - als Stub für den Remote Client Ablauf - Client ermittelt zunächst per JNDI eine Referenz auf das Business Interface - Referenz wird beim Deployment im Verzeichnisdienst (JNDI) registriert // instantiates Connection to JNDI Service InitialContext ctx = new InitialContext(ProtocolParameter); // lookup returns Proxy Reference of Business Interface Object o = ctx.lookup("HelloWorld/HelloWorldBean/remote"); - Cast der Proxyreferenz konvertiert zum Business Interface HelloWorld hello = null; // casts Proxy-Object to Business Interface hello = (HelloWorld) o; - Alternative - statischen Methode narrow konvertiert Proxy-Referenz typsicher zum Business Interface // Typecasting due to RMI over IIOP hello = (HelloWorld) PortableRemoteObject.narrow(o,HelloWorld.class); - Alternative - Zugriff auf das Business Interface durch Refaktorisierung des Proxyobjekts // Refactoring of Naming Context hello = (HelloWorld) ctx.lookup(o.getClass().getName()); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 47 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.3.1 Zugriff zum EJB über das Proxy - serverseitig wird ein Proxy Objekt erzeut - als Stellvertreterrolle für den anfragenden Client - lokale und remote Zugriffe sind identisch // access to server-side business logic (EJB) hello.echo("Hello EJB3 World"); Eigenschaften - Fachlogik ist gekapselt, d.h. veborgen ► encapsulation - Business Methoden lassen sich nur über die erzeugte Objektinstanz aufrufen - Container fängt die Aufrufe an das Business Object auf und leitet diese weiter - Interception ► Abfangen, Unterbrechen - kontrollieren der Aufrufe - Vor- und Nachbearbeitung der Aufrufe ► Sicherheit, Transaktionen, Persistenz EJB Remote Procedure Call 5. Interception und Weiterleiten 4. Instanzii Instanziierung EJB Instanz Enterprise Java Beans 3. Remote Aufruf Business Interface Client obj 2. Referenz auf Proxy obj JNDI obj erzeugte Referenz in Namensdienst EJB - Container ►Deployment 1. Anfrage nach Referenz © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 48 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.3.2 Sequenz Diagramm wiki Ein Sequenzdiagramm (engl. sequence diagram) diagram) ist eine der 14 Diagrammarten in der Unified Modeling Language (UML), einer Modellierungssprache Modellierungssprache für Software und andere Systeme. Das Sequenzdiagramm ist ein Verhaltensdiagramm, Verhaltensdiagramm, genauer eines der vier Interaktionsdiagramme. Interaktionsdiagramme. Es zeigt eine bestimmte Sicht auf die dynamischen Aspekte des modellierten Systems. Ein Sequenzdiagramm ist eine grafische Darstellung einer Interaktion und beschreibt den Austausch von Nachrichten zwischen Ausprägungen mittels Lebenslinien. Lebenslinien. 6.3.3 RMI (Remote Method Invocation) - Remote Method Invocation ► Aufruf entfernter Methoden - ist Aufruf einer Methode eines entfernten Java-Objekts - "entfernt" bedeutet Objekt ist in einer anderen VM ► virtuellen Maschine - realisiert die Java-eigene Art eines RPC ► Remote Procedure Call - Aufruf für das aufrufende Objekt ist wie ein lokaler Aufruf - besondere Ausnahmen abfangen ► NamingException - wie Verbindungsabbruch - Server nicht erreichbar - clientseitig ist der Stub für den Netzwerktransport zuständig - eine mit dem RMI-Compiler rmic erzeugte Klasse Stub muss lokal oder über das Netz verfügbar sein © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 49 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 oder - entfernte Objekte werden durch entferntes Objekt bereitgestellt - erste Verbindungsaufnahme benötigt Adresse des Servers und Bezeichners (RMI-URL) Namensdienst auf dem Server liefert eine Referenz auf das entfernte Objekt - das entfernte Objekt im Server muss sich unter diesem Namen registriert sein - RMI-Namensdienst wird über statische Methoden der Klasse java.rmi.Naming angesprochen Namensdienst ist als eigenständiges Programm implementiert und wird RMI Registry genannt rmi://[host][:port][/[object]] Kommunikationsprotokoll - RMI bezeichnet Kommunikationsprotokoll für entfernte Aufrufe zwischen Java-Objekten - RMI bezeichnet eine Java-Standard-Klassenbibliothek als Teil der JSE - für RMI sind zwei Ports reserviert - Port 1099 ist für die RMI-Registry reserviert, also den Namensdienst Port 1098 für den Activator reserviert - IIOP (Internet Inter ORB Protokoll) als alternatives Kommunikationsprotokoll - viele JEE Server Implementationen arbeiten mit RMI over IIOP 6.3.4 RMI Kommunikationsmodell - der Server registriert ein Remote Object bei der RMI-Registry unter einem eindeutigen Namen - der Client schaut bei der RMI-Registry unter diesem Namen nach und bekommt eine Objektreferenz, die seinem Remote Interface entspricht - der Client ruft eine Methode aus der Objektreferenz auf (dass diese Methode existiert, wird durch das Remote Interface garantiert) - der Server gibt dem Client die Rückgabewerte dieses Aufrufes, oder der Client bekommt eine Fehlermeldung (z. B. bei einem Verbindungsabbruch) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 50 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 RMI Ablauf 1. 2. 3. 4. 5. Client fordert mittels einer URL und der lookup-Methode eine Referenz vom Naming Service an Proxy-Referenz wird zurückgeliefert und der Stub-Code vom RMI-Server heruntergeladen Client ruft eine Methode mittels der Proxy Referenz auf Verpacken (Marshalling) des Aufrufs im Stub und übertragen an den RMI-Server Unmarshalling der Anfrage vom Client im Skeleton auf dem Server Verarbeitung auf dem Server 6. Ergebnisse von der Server-Applikation an den Skeleton senden 7. Marshalling des Ergebnisses im Skeleton und senden an den Client 8. Unmarshalling des Ergebnisses im Stub auf dem Client Aufgabe ► RMI - erstellen und testen Sie eine RMI Client Server "Hallo Welt" - Remote Interface public interface Hello extends Remote { String sayHello() throws RemoteException; } - Server ► Rmi-Registry starten mit: <path to jdk>\bin>start rmiregistry Server obj = new Server(); Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); // Bind the remote object's stub in the registry Registry registry = LocateRegistry.getRegistry(); registry.bind("Hello", stub); - Client Registry registry = LocateRegistry.getRegistry(host); Hello stub = (Hello) registry.lookup("Hello"); String response = stub.sayHello(); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 51 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.4 EJB Kommunikationsmodelle An Prozesse beteiligte EJBs kommunizieren: - synchron, entfernt - synchron, lokal - asynchron, nachrichtenbasiert 6.4.1 synchrone, entfernte Kommunikation - Aufrufe erfolgen als synchrone Methodenaufrufe - mittels RMI-IIOP in einem verteilten System - Übertragung der Daten erfolgt mittels "by-Value" Semantik - als Kopie der Originaldaten - Parameter werden vom Client auf den Server kopiert Ablauf 1. EJB-Container erzeugt Proxy Object des Business Interface 2. EJB-Container registriert Proxy Object beim Namensdienst 3. Client fordert vom Namensdienst Referenz auf Proxy Object 4. Namensdienst liefert Referenz auf das Proxy Object 5. Client ruft über das Proxy Object die Geschäftsmethoden der EJB auf 6. Proxy Object delegiert Methodenaufruf an die EJB-Instanz © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 52 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.4.2 synchrone, lokale Kommunikation - Aufrufe von Diensten einer EJB-Komponente sind synchrone Methodenaufrufe - die Übertragung der Daten erfolgt mittels "by-Referenz" Semantik - als Referenz der Originaldaten - Parameter werden als Referenz auf die Originaldaten vom Client auf den Server übergeben Ablauf 1. EJB-Container erzeugt Proxy Object des Business Interface 2. EJB-Container registriert Proxy Object beim Namensdienst 3. Client fordert vom Namensdienst Referenz auf Proxy Object 4. Namensdienst liefert Referenz auf das Proxy Object 5. Client ruft über das Proxy Object die Geschäftsmethoden der EJB auf 6. Proxy Object delegiert Methodenaufruf an die EJB-Instanz 6.4.3 asynchron, nachrichtenbasierte Kommunikation - Schnittstelle zwischen objektorientierten und nicht-objektorientierten Prozessen in verteilten Systemen Ablauf: Ablauf: 1. 2. 3. 4. 5. 6. 7. Applikationsserver registriert Nachrichtenempfänger beim Namensdienst EJB-Container registriert sich als Listener für Nachrichten Client fordert vom Namensdienst Referenz des Nachrichtenempfängers Namensdienst liefert Referenz auf Nachrichtenempfänger Client sendet Nachrichten an Nachrichtenempfänger Nachrichtenempfänger übermittelt Listener eingegangene Nachricht Listener delegiert Nachricht an Bean-Instanz © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 53 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 6.4.4 Überblick über die Kommunikationsmodelle Stateless Session Bean Stateful Session Bean Message Driven Bean Entity Bean asynchrony achrichtenbasiert synchron lokal EJB Typen synchron entfernt die folgende Tabelle weist die Aufrufmodelle den verschiedenen EJB-Typen zu Kommunikationsmodel © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 54 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Inside EJB3 E Testen Lerninhalte Testarten TDD TestDrivenDevelopment Unit Testing Mock Testing Integrationstests © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 55 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen 7 Testen wiki Ein Softwaretest ist ein Test während der Softwareentwicklung, Softwareentwicklung, um die Funktionalität einer Software an den Anforderungen und ihre Qualität zu messen und Softwarefehler Softwarefehler zu ermitteln. 7.1 Testarten - Unit-Test - Units sind einzelne Objekte - isoliertes Verhalten wird getestet - Integrationstest - mehrere Objekte bilden ein Workflow - deren Interaktion wird getestet - Lasttest - Skalierbarkeit des Workflows - grosse Anzahl von Requests wird getestet - Akzeptanztest - Anforderungen an die Applikation - Grundlage zur Abnahme Testverfahren die Praxis beschreibt eine Kombination von Testverfahren - ZIEL: aussagekräftiges Ergebnis - Review – prüft das Ergebnis (Ziel) - Audit – prüft die Vorgehensweise und den Ablauf (Weg ins Ziel) - BlackBlack-BoxBox-Test – prüft definierte Schnittstellen (Funktionalität) - WhiteWhite-Box-Test – prüft die Details der Logik (Codereview) - Durchführung - Testprotokoll (wer, wozu, wie, was wird getestet) - Programm (Test-Case beschreibt Testfall) die Praxis verlangt Automatisierung der Testverfahren wiki Vor allem bei testgetriebener Entwicklung ist die Testautomatisierung besonders wichtig. Tests werden im Idealfall nach jeder Änderung ausgeführt. Bei nicht automatisierten Tests ist der Aufwand Aufwand so gross, dass häufig auf die Tests verzichtet wird. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 56 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen 7.2 funktional vs. nicht-funktional funktionale Tests ► Benutzeranforderungen - gemäss Anforderungen - was macht das Programm - beschrieben durch Use Case nichtnicht-funktionale Tests ► Qualitätsanforderungen - Integration - Zusammenarbeit der einzelnen Teile, z.B. Server, DB, etc. - Belastung - Multi-User Verhalten - Akzeptanz - Kunde, Benutzer, etc. Softwaretests steigern Qualität der Software eXtreme Programming - alternativer Ansatz - senkt Softwareentwicklungskosten - orientiert an Bedürfnissen der Kunden Der Kunde bekommt das, was er braucht, und dann, wenn er es braucht. braucht. - XP (eXtreme Programming) baut auf - Kommunikation ►Auftraggeber - Einfachheit ► klare Schnittstellen - Feedback ► Testen (TDD) - Courage ► "code a little, test a little" © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 57 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen 7.3 Test Driven Development TDD ist Aspekt von Extreme Programming - einfache Entwicklung in der Erstellung von Software - komplexe Softwaresysteme in kleinen und einfachen Schritten entstehen lassen - Tests des Designs und der Implementierung stehen im Vordergrund - definiert Test, der die Funktion eines kleinen Teils des Systems beschreibt - Treffen von Design-Entscheidungen sind nicht in der Startphase erforderlich - Code muss nicht von Anfang an richtig sein, dieser wird kontinuierlich refaktoriert - Ausführung mit Hilfe von (Software)-Tools - z.B: JUnit (http://junit.org/) meist verbreitet - durch Assertion (Engl: Aussage, Behauptung) - asserts(), assertNotNull(), assertEquals(), etc. // SYNTAX : Assertion < Assertion> ( <testen> <Kriterium> <gegeben> ) // Beispiel gegeben : 3 assert( 1 + 2 == 3 ) Kriterium : EQUALS testen : 1 + 2 TDD Konzept definiert Unittests und Refaktorierungen - erstellen (Logik schreiben) - Test beschreibt, wie sich ein kleiner Teil der Software (Unit) verhalten soll - testen (erfolgreiche Tests definieren) - Design des Codes ist zweitrangig - wichtig ist, dass der Test erfolgreich läuft - aufräumen (schönerer Code schreiben) - mittels Refaktorierung (Umorganisation) überarbeiten, bis der Test wieder fehlerfrei läuft © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 58 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen 7.4 JUnit wiki JUnit ist ein Framework zum Testen von JavaJava-Programmen, das besonders für automatisierte UnitUnitTests einzelner Units (meist Klassen oder Methoden) Methoden) geeignet ist. ist Framework ► www.junit.org - erlaubt Werte und Bedingungen zu testen, die erfüllt sein müssen die Klasse Assert definiert eine Vielfalt von assert Methoden unterstützt das Testen von Programmen ein einfacher Test definiert public class BasicTest { public void setUp() { ... } public void testFirstThing() { assert...(...); } public void testSecondThing() { assert...(...); } public void tearDown() { ... } } Aufbau - die Methode setUp() initialisiert den Testcase - die Test-Methoden (Testcase) fangen mit test an - testFristThing() - testSecondThing() - die Methode tearDown() finalisiert den TestCase - Assertions überprüfen die Test-Methoden - Erfüllen von Anforderungen - Einhalten von Bedingungen - Exceptions sollten nicht gefangen (catch) werden - Test-Methoden Exceptions soll Exception werfen - JUnit-Framework kann dann passend darauf reagieren - Ausführen von Tests - Testklasse in Eclipse ausführen ► Run As ►JUnit Test © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 59 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen JUnit Annotaions ►JUnit 4 - Testfunktionen werden als statische Methoden importiert import import import import import org.junit.Test; org.junit.Before; static org.junit.Assert.assertEquals; static org.junit.Assert.assertNotNull; static org.junit.Assert.assertTrue; public class TestHelloWorldBean { ... @Test(expected = NamingException.class) public void noEcho() throws NamingException { ... JUnit 4 Annotaions Begriff Beschreibung kennzeichnet Methoden als ausführbare Testfälle @Test markiert Setup-Aufgaben, die für jeden Testfall wiederholt werden sollen @Before markiert Teardown-Aufgaben, die für jeden Testfall wiederholt werden sollen @After @BeforeClass markiert Setup-Aufgaben, die nur einmal pro Testklasse ausgeführt werden sollen @AfterClass markiert Teardown-Aufgaben, die nur einmal pro Testklasse ausgeführt werden sollen kennzeichnet temporär nicht auszuführende Testfälle @Ignore 7.5 EJB UnitTests EJB bietet den Vorteil der Abstraktion - stellt Schnittstellen zur Verfügung ► Integration - läuft im EE und SE Umfeld ► Independency - lose Kopplung der Dienste ► Isolation Ziel: jede Klasse in Isolation testen TD TDD - In der Praxis lassen sich Klassen oft nicht isoliert testen - durch Abhängigkeiten von Geschäftsdarten - durch Integration durch Workflow Lösungsansätze Begriff Beschreibung Stub fragmentale Implementierung als Stellvertreter Dummy Ersatzklasse, um das Verhalten zu testen Mock dynamisches Dummy ► konfigurierbar © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 60 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen 7.6 Mocks wiki Mock Mock--Objekte werden in der Testgetriebenen Softwareentwicklung Softwareentwicklung DummyDummy-Objekte oder Attrappen genannt, die als Platzhalter für echte Objekte innerhalb von Unit Unit-Tests verwendet werden. - dem zu testenden Objekt wird ein Stellvertreter zugewiesen ► Mock - referenzierte Objekte lassen sich einfach ersetzen Vorteile - einzelne Klassen können isoliert getestet werden - alle referenzierten Klassen werden durch Mocks ersetzt - Tests sind performant - keine Datenbanken notwendig ► Mocks sind transient - keine Verteilten Ressourcen notwendig ► Mocks sind lokale Ressourcen - Fehlerverhalten kann leicht provoziert/simuliert werden - durch Ausnahmen ► z.B. HostNotFoundException - durch Konfiguration ► z.B. NullPointerException - durch Workflow ► z.B. SqlException 7.6.1 Mock Testing Isoliertes Testen ist in der Praxis oft nicht möglich! - Mock-Objekte überprüfen Interaktion mit Umgebung - Umgebung nicht vorhanden ► asynchrone Kommunikation - oder sehr zeitaufwändig ► keine Daten vorhanden - implementieren Schnittstelle - Mock-Objekt liefert keine Echtdaten ► simuliert Geschäftsprozess - nur festgelegte Testdaten ► wenn simulierte Abläufe möglich sind - Mock-Objekte sind nur limitiert einsetzbar - Objekt liefert keine deterministische Ergebnisse ► keine aktuellen Daten wie Uhrzeit, Temperatur - Objekt basiert nicht auf Interaktion ► kein Testen von Benutzungsoberflächen Mocktesting erlaubt nur reduziert eine sinnvolle Alternative. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 61 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen Ablauf - Mock Objekt eines Proxy erzeugen ► myBankMock - erwartetes Mock Verhalten aufzeichnen - Funktion testen public void test_getZinssatz() { BankBean toTest = this.getBeanToTest(); assertNotNull(toTest); final Mock myBankMock = this.getMockControl(Bank.class); assertNotNull(myBankMock); final SessionBean zins = new MockedSessionBean(); // instrument mock myBankMock.expects(once()).method("getRate").will(returnValue(zins)); // call the expected operation toTest.tellRate(); } 7.7 Integrationstest - @RunWith Annotation erlaubt das Erkennen der Abhängigkeiten z.B. @Parameters - @Parameters erlaubt parametrisierter Test @RunWith(value = Parameterized.class) public class JunitParameterizedTest { private int number; public JunitParameterizedTest (int number) { this.number = number; } @Parameters public static Collection<Object[]> data() { Object[][] data = new Object[][] { { 1 }, { 2 }, { 3 }, { 4 } }; return Arrays.asList(data); } @Test public void pushTest() { System.out.println("Parameterized Number is : " + number); } } - @Test(expected= …) definiert das Mockverhalten @Test(expected = NamingException.class) public void noEcho() throws NamingException { Object object = initialContext.lookup("not bound"); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 62 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen 7.8 Funktionale Tests - in der Paxis etablieren sich Werkzeuge - Fit (Framework for Integrated Test) http://fit.c2.com/ - Bedingungen als HTML - FitNesse http://www.fitnesse.org/ - Bedingungen in wiki - Testbedingungen werden formuliert und die Resultate auf einem Browser ausgegeben Aufgabe ► FitFit-Test - testen Sie die SLSB Applikation durch FitPro - ► http://www.luxoft.com/fit/ - durch graphische Definition - und Generierung der ColumnFixture generierter Source /** * Generated by FITpro Fixture Generator */ import fit.ColumnFixture; /* * TODO: modify class to match the FIT test * edit and add methods as required. */ public class CalculateRate extends ColumnFixture { public String amount; public String calculate() { // TODO Auto-generated method stub return null; } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 63 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen Aufgabe ► UnitTest - Testen Sie das HelloWorldBean mit JUnit Tests public class TestHelloWorldBean { private InitialContext initialContext; @Before public void setUp() throws NamingException { Properties properties = new Properties(); properties.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); properties.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099"); initialContext = new InitialContext(properties); } @Test public void echo() throws NamingException { Object object = initialContext.lookup("HelloWorldBean/remote"); assertNotNull(object); assertTrue(object instanceof HelloWorld); HelloWorld hello = (HelloWorld) object; assertEquals("Server Echo : Hello EJB World", hello.echo("Hello EJB World")); } @Test(expected = NamingException.class) public void noEcho() throws NamingException { Object object = initialContext.lookup("not bound"); } } wiki Als Heisenbug bezeichnet man einen Programmfehler (engl.: Bug) der nur äusserst schwer schwer oder garnicht zuverlässig reproduzierbar ist. Das Kennzeichen eines Heisenbugs ist die extrem schwierige Wiederherstellung der für die Reproduktion des Bugs notwendigen Rahmenbedingungen. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 64 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Testen F SLSB Lerninhalte Begriffe Verwendung Lebenszyklus Annotations Kontext © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 65 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos 8 SLSB Stateless Session Bean ► zustandslos - modelliert einfacher Geschäftsprozess - z.B. Zinsberechnung - kann keine Client dedizierten Daten speichern - dediziert ►Lat: jemandem etwas zueignen / für ihn bestimmen - haben keine Identität - Aufgabe muss mit einem Methodenaufruf erledigt sein - zweimaliger Aufruf des Beans garantiert nicht dieselbe Instanz auf dem Server - sind oft als Fassaden eingesetzt - für Aufrufe an weitere Bean Instanzen - z.B. Persistenz Kontext pooling - mehrere Clients rufen dasselbe Bean auf - gemeinsame Nutzung von Sourcen weniger Objekte im Einsatz Bean ist singleein Bean kann nur einen Client behandeln single-threaded ►ein Ablauf - Container erzeugt während Deployment Beaninstanzen im Pool - konfigurierbar @ProConstruct Methode steht nicht in direkter Kopplung zum aufrufenden Client Annotation @Stateless ► C Parameter Beschreibung name expliziter Name der Session Bean mappedName mappen des Namens auf einen weiteren implementierungsspezifischen (JNDI)-Namen Typ Default unqualifizierter String Klassenname String (nicht im Standard-Umfang der Spezifikation) description eine Beschreibung für das Bean String Annotation @Remote ► C, I Parameter Beschreibung value alle Schnittstellen, die entfernt zugreifbar sein sollen Typ Class[] Default © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 66 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos 8.1 Bean Life Cycle does not exist Container initiated: @PreDestroy Methode-Ready-Pool Client initiated: business methods Container initiated: Class.newInstance() Dependency Injection @PostConstruct @PostConstruct Container initiated: Timeout Callback LifeCycleMethoden Annotation Beschreibung @PostConstruct Wird vom Container aufgerufen nachdem die Bean durch den Container instanziiert worden ist. Für den Client ist der Aufruf dieser Methode transparent. @PreDestroy Ressourcen werden durch den Bean Provider freigegeben. Für den Client ist der Aufruf dieser Methode transparent. @Remove Timeout Callback 8.2 bei SLSB eine NO-OP ► implementiert, jedoch ohne Wirkung bezieht sich auf eine Container Timer Funktion Dependency Injection wiki Dependency Injection (DI) ist ein Entwurfsmuster und dient in einem objektorientierten System dazu, die Abhängigkeiten zwischen zwischen Komponenten oder Objekten zu minimieren. Dependency Injection ist eine Anwendung des Prinzips der Inversion of Control (IoC), bezieht sich aber nur auf die Erzeugung und Initialisierung von Objekten. Sie kann als Verallgemeinerung der Fabrikmethoden Fabrikmethoden verstanden werden. Die Funktionalität bleibt trotz dieser Kontrollumkehr als Einfügung enthalten. Dadurch ist es einfach möglich, Abhängigkeiten zu erkennen. - fördert lose Kopplung - Objekte erhalten ihre Abhängigkeiten passiv © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 67 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos 8.3 Übung : Zinsberechnung - erstellen und deployen Sie eine Stateless Session Bean - die eine Zinsberechnung als Businessmethode definiert - eines Geldbetrages amount - über eine definierte Laufzeit years - zu einem gegebenen Zinssatz rate Ansatz: - entwicklung einer Geldanlage durch Zins und Zinseszins public double calculate(double amount, double rate, int years) { return amount * Math.pow((rate / 100.0) + 1.0, (double) years); } Eigenschaften der SLSB - Interfacebezug über @Remote / @Local in der Beanklasse - implizit (deklariert) oder explizit (programmiert ► implements) optionaler Name als Parameter @Stateless(name = "RateBean") @Remote(ZinsRemote.class) @Local(ZinsLocal.class) public class ZinsBean { ... // überschreibt den Namen der Bean // implizite Interfaces Implementation // seit EJB 3.1 optional - parameterloser Konstruktor ist erforderlich - muss public sein - EJB Container initialisiert Bean über Class.newInstance() - wird automatisch erzeugt - abhängig von Implementation public ZinsBean() {} © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 68 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos Zugriff auf das Environment Environment ► Umgebung der Bean private float rate = 0.0f; @PostConstruct public void injectRate() { InitialContext ic; ic = new InitialContext(); rate = ((Float) ic.lookup("java:comp/env/Rate")).floatValue(); System.out.println("Rate set:\t" + rate); } auf Deploymentdescriptor: ejbejb-jar.xml <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" ... version="3.0"> <enterprise-beans> <session> <ejb-name>RateBean</ejb-name> <env-entry> <env-entry-name>Rate</env-entry-name> <env-entry-type>java.lang.Float</env-entry-type> <env-entry-value>5.2</env-entry-value> </env-entry> </session> </enterprise-beans> </ejb-jar> oder Argument Argument direkt mit @Resource annotiert ► Dependency Injection @Stateless(mappedName = "ejb/zins") @Remote(ZinsRemote.class) @Local(ZinsLocal.class) public class ZinsBean { @Resource(name = "Rate") private float rate; Annotation @Resource ► T Parameter Beschreibung Beschreibung der referenzierten Ressource description mappedName name Typ String Name der referenzierten Ressource im globalen Namensdienst (nicht im Standard-Umfang der Spezifikation) Name, unter dem die referenzierte Ressource im lokalen Namensdienst (java:comp/env) der Komponente, die die Annotation verwendet, auffindbar sein soll Annotation @Resources ► T Parameter Beschreibung Liste der einzelnen Ressource-Annotationen value Default String String Typ Default Resource[] © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 69 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos 8.4 EJB Kontext - Zugriff auf EJBContext - Security - z.B. getCallerIdentity - Transaction - z.B. setRollbackOnly Methoden des EJB-Kontext (Ausschnitt) Methode Beschreibung Beschreibung Shortcut für Objekte des Enterprise Naming Context (ENC) - im JNDI ist der ENC unter "java: comp/env" zu finden Einträge des ENC können mit @Resource injiziert werden lookup() - ENC: lookup("ejb/myBean"); JNDI: lookup("java:comp/env/ejb/myBean"); nur SessionContext getBusinessObject() - liefert robuste Referenz auf das EJB nur SessionContext getInvokedBusinessInterface() getInvokedBusinessInterface() - liefert das Interface der Geschäftsschnittstelle Local, Remote oder WebService Zugriff auf SessionContext ► extends EJBContext - Referenz auf aktuelle Bean Implementation (z.B. BusinessObject) @Stateless(name = "RateBean") @Remote(ZinsRemote.class) @Local(ZinsLocal.class) public class ZinsBean { @Resource private SessionContext sc; public Object getRemoteReference() { return sc.getBusinessObject(ZinsRemote.class); } public Object getRemoteInterface(){ return sc.getInvokedBusinessInterface(); } } oder mit @Resource Annotation auf Methodenebene @Resource public void setSessionContext(SessionContext sc) { this.sc = sc; } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 70 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos EJBContext vs SessionContext - EJBContext ist ein Interface, implementiert vom Container - SessionBeans brauchen eine Subklasse ► SessionContext - Entity Beans brauchen eine Subklasse ► EntityContext - EJBContext Objekte versorgen Beanklasse mit Informationen über - Bean - referenzieren der Bean-Referenz ► als robuster Handle - referenzieren des Proxyobjektes - Container - suchen im Bean's ENC - referenzieren einen Timer-Service - Client - authentifizierter Benutzer - Überprüfung der Benutzerrolle © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 71 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SLSB Stateless Session Bean ► zustandslos G SFSB Lerninhalte Begriffe Verwendung Lebenszyklus Annotations © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 72 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet 9 SFSB Stateful Session Session Bean ► zustandsbehaftet - modelliert Geschäftsprozess - z.B. Shopping Cart - kann Client dedizierte Daten speichern - Zustandsbehaftet ► kann den Zustand (Session) eines Client speichern - mehrmaliger Aufruf des Beans für einen Geschäftsablauf möglich - kein pooling zusätzlicher LIFELIFE-State ► passivated - wenig Ressourcen und Memory beansprucht - dadurch bessere Performance Eigenschaften - Session Bean darf keine Interfaces implementieren (ausser die eigenen) - alle public Methoden sind sichtbar Client sieht den Typ der Bean-Klasse Guard ist immer implementiert wiki GuardGuard-Pattern: Pattern: Methodenaufrufe werden auf die entsprechenden Zugriffsrechte überprüft. Annotation @Stateful ► C Parameter Beschreibung Typ Default name expliziter Name der Session Bean String unqualifizierter Klassenname mappedName mappen des Namen auf einen weiteren implementierungsspezifischen (JNDI)-Namen String (nicht im Standard-Umfang der Spezifikation) description eine Beschreibung für das Bean Annotation @Remove ► M Parameter Beschreibung retainIfException Löschverhalten der Bean bei einer Exception String Typ Default Boolean true Annotation @Local ► C,I, optional seit EJB3.1 Parameter Beschreibung Typ Beschreibung value alle Schnittstellen, die lokal zugreifbar sein sollen Class[] Default © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 73 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet 9.1 Bean Life Cycle does not exist Container initiated: @PreDestroy Container initiated: Class.newInstance() Dependency Injection @PostConstruct @PostConstruct Client initated: @Remove Exception Methode-Ready timeout afterBeginn() beforeCompletion() afterCompleteion(* afterCompleteion(*) in Transaktion Container initiated: @PostActivate Client initiated: nichttransaktionale Business Methods Client initiated: transaktionale Business Methods Container initiated: @PrePassivate @PrePassivate Client initated: Methodenaufruf Client initiated: (Least Recently Used) * COMMIT = true ROLLBACK = false Passive Bean Life Cycle Methoden LifeCycleMethoden Annotation Beschreibung @PostConstruct @PreDestroy @PrePassivate @PrePassivate @PostActivate @Remove Wird vom Container aufgerufen nachdem die Bean durch den Container instanziiert worden ist. Für den Client ist der Aufruf dieser Methode transparent. Ressourcen werden durch den Bean Provider freigegeben. Für den Client ist der Aufruf dieser Methode transparent. Wird durch den Container aufgerufen, bevor die Bean in den passiven Zustand verschoben wird. Ressourcen werden durch den Bean Provider freigegeben. Für den Client ist der Aufruf dieser Methode transparent. Der Container holt die passivierte Instanz der Bean in den Arbeitsspeicher zurück und ruft danach die mit @PostActivate markierte parameterlose Methode auf, um Zustand der Bean erneut zu initialisieren. Wird vom Container aufgerufen, nachdem der Client eine Methode des RemoteInterface aufgerufen hat, die durch die Bean mit der Annotation @Remove gekennzeichnet ist. In dieser Methode sollten die für die Bean reservierten Ressourcen wieder freigegeben werden. Danach löscht der Container die BeanInstanz. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 74 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet Aufgabe ► Kontoführung Kontoführung - erstellen und deployen Sie ein SFSB Bank zur Verwaltung von Konten - benützen Sie dazu das Objekt Konto - verwenden Sie die @Data Annotation des Lombok-Projekt - "nr" ist Business-Key, also unique ► jedoch nicht PK der DB - Anwenderfälle - Benutzer kann Konto speichern - Benutzer kann Konto löschen - Benutzer kann Konten suchen - Speichern Sie die Konten in einer (mySQL) Datenbank Tabelle Account DROP TABLE IF EXISTS ACCOUNT; CREATE TABLE ACCOUNT( ID INTEGER PRIMARY KEY AUTO_INCREMENT, NR VARCHAR(20), NAME VARCHAR(20), SALDO FLOAT(5,2), CURRENCY VARCHAR(20) ); LOCK TABLES `account` WRITE; INSERT INTO `account` VALUES (1,'120-1','Sparkonto',100.50,'CHF'), (2,'120-2','Privatkonto',280.20,'CHF'), (3,'120-3','Eurokonto',250.00,'EUR'), UNLOCK TABLES; (4,'120-4','Dollarkonto',305.10,'USD'); - starten Sie den MySQL Datenbank Deamon und erzeugen Sie eine Datenbank jee c:\jee\mysql\bin>mysqld –install c:\jee\mysql\bin>net start mysql c:\jee\mysql\bin>mysql –u root mysql>create database jee; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 75 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet - erzeugen Sie die Datenbankverbindung durch den Bean Lifecycle - mit der Annotaion @PostConstruct ► Ansatz - vergessen Sie nicht das Schliessen der Resource ► @PreDrestroy @Stateful public class BankBean implements Bank { @PostConstruct public void getDatasource(){ // BMP - Bean Managed Persistence String url = "jdbc:mysql://localhost/bank?user=root"; Class.forName("com.mysql.jdbc.Driver").newInstance(); co = DriverManager.getConnection(url); } - testen Sie mit entsprechenden JUnit Tests @Test public void saveKonto() { Account k = new Account("120-9", "TestAccount", 100.0F, "EUR"); bank.createAccount(k); Account savedAccount = bank.getAccountByNr("120-9"); assertEquals("120-9", savedAccount.getNr()); } 9.2 Verschalten von Beans - durch die Bean-Klasse - oder durch das Interface @Stateful public class BankBean implements Bank { @EJB(mappedName = "ejb/zins") private ZinsLocal rate; // das Bean Interface @EJB private ZinsBean rate; // die Bean Klasse ZinsLocal zins = null; // über Lookup try { ic = new InitialContext(); // auch: ic.lookup(Zins.class.getName()); zins = (ZinsLocal) ic.lookup("ejb/zins"); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 76 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet Annotation @EJB ► T, M Parameter Beschreibung beanInterface beanName mappedName mappedName name Interface-Typ der referenzierten Bean Remote oder Local logischer Name der referenzierten Bean name Attribut der @Stateless, @Stateful, @MessageDriven Name der referenzierten Bean im globalen Namensdienst (nicht im Standard-Umfang der Spezifikation) Name, unter dem die referenzierte Bean im lokalen Namensdienst (java:comp/env) der Komponente, die die Annotation verwendet, auffindbar sein soll Annotation @EJBs Parameter Beschreibung Liste der EJB Annotationen value Typ Default Class Object.class String String String Typ Default EJB[] Aufgabe ► Local Interface - Berechnen Sie den Zins durch eine SFSB Bank - verwenden Sie das Lokale Interface der ZinsBean "Zins" verwenden Sie die Beanklasse "ZinsBean" Ansatz @Stateless (mappedName = "ejb/zins", name= "RateBean") public class ZinsBean { public double calculate(double amount, int years) { return amount * Math.pow((rate / 100.0) + 1.0, (double) years); } } @Stateful public class BankBean implements Bank { @EJB(mappedName="ejb/zins") private Zins rate; public double tellRate(){ return rate.getRate(); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 77 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet 9.3 Anbindung einer DataSource Resource-Verwaltung unterscheidet zwischen Bean- und Container-Managed - JDBC Anbindung in der Bean ► Bean Managed - DataSource Injektion über @Resource ► Container Managed Injektion der DataSource @Stateful public class BankBean implements Bank { @Resource(mappedName = "java:jdbc/bank") private DataSource ds = null; oder @Stateful @Resource(mappedName = "java:jdbc/bank", name = "bankDB") public class BankBean implements Bank { @PostConstruct public void getDatasource(){ ds = (DataSource) sc.lookup("bankDB"); } - jdbc/bank ist eine serverspezifische (JBoss) Rescource - wird durch den Container bereitgestellt - wird beim Starten des Servers instanziiert <JBoss_Home>/server/jee/deploy/mysql--ds.xml JBoss spezifische DataSource: <JBoss_Home>/server/jee/deploy/mysql <datasources> <local-tx-datasource> <jndi-name>jdbc/bank</jndi-name> <connection-url> jdbc:mysql://localhost:3306/jee </connection-url> <driver-class>com.mysql.jdbc.Driver</driver-class> <user-name>root</user-name> <password></password> <local-tx-datasource> <datasources> - wird beim Serverstart zur Verfügung gestellt - die Resource wird gebunden und ist im Log ersichtlich Bound ConnectionManager 'jboss.jca:service=DataSourceBinding,name=jdbc/bank' to JNDI name 'java:jdbc/bank' © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 78 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet 9.3.1 EJB Ressourcen Annotation @Resource ► T Parameter Beschreibung authenticationauthenticationType description mappedName name shareable shareable CONTAINER: die Anmeldedaten werden im Deskriptor hinterlegt BEAN: die Anmeldedaten werden explizit bei der Erzeugung der Verbindung übergeben Beschreibung der referenzierten Ressource Name der referenzierten Ressource im globalen Namensdienst Name, unter dem die referenzierte Ressource im lokalen Namensdienst (java:comp/env) der Komponente auffindbar sein soll definiert ob die Ressource von mehreren Komponenten genutzt werden kann Annotation @Resources ► T Parameter Beschreibung Liste der einzelnen Ressource-Annotationen value 9.4 Typ Default AuthenticationTyp CONTAINER String String String Boolean true Typ Default Resource[] DAO Data Access Object wiki Data Access Object (DAO, deutsch: „Datenzugriffsobjekt“) ist ein Entwurfsmuster, das den Zugriff auf unterschiedliche Arten Arten von Datenquellen (z. B. Datenbanken, Dateisystem, etc.) so kapselt, dass die angesprochene Datenquelle ausgetauscht werden kann, ohne dass der aufrufende Code geändert werden muss. Dadurch soll die eigentliche Programmlogik von technischen Details der Datenspeicherung befreit werden und flexibler einsetzbar sein. DAO ist also ein Muster für die Gestaltung von Programmierschnittstellen (APIs). Wenn eine Programmiersprache keine Trennung von Schnittstellendefinition und -Implementierung ermöglicht, muss ein ein DAO die definierte Schnittstelle unmittelbar implementieren. DAOs kappseln den Datenbankzugriff - DAOs führen keine Datenbankabstraktion durch - DAOs sind jeweils für ein spezielles Speichermedium optimiert - der Zugriff auf dieses Medium wird über das vom DAO vorgegebene DAOs minimieren den Portierungsaufwand einer Anwendung beim Wechsel des Speichermediums. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 79 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet Aufgabe ► generic DAO - kapselt Sie die Datenbankzugriffe in einem DAO - abstrahieren Sie die allgemeine Funktionalität in ein generic DAO - delegieren Sie die Datenbankfunktionen aus der Bank Bean @Stateless public class BankBean implements Bank { @EJB private KontoDAOBean kontoDAOBean; public void createKonto(Konto k) { this.kontoDAOBean.save(k); } public List<Konto> getAllKontos() { return this.kontoDAOBean.findAll(); } public Konto getKontoByNr(String nr) { return this.kontoDAOBean.findByNr(nr); } ... Aufgabe ► lokales lokales Speichern einer serverseitigen Bean Referenz - Handle definiert robuste Referenz auf Objekte ► z.B. für Cookie - definiert Wiederverwendbarkeit Remote Referenz auf EJB3 ist robust POJO muss serialisierbar sein @Test public void testSerialization() throws Exception { saveBank(bank.getRemoteReference()); assertEquals(bank.getRemoteReference(), loadBank().getRemoteReference()); } private void saveBank(Object bank) throws IOException { // write "bank" Object Reference to serialized File FileOutputStream f = new FileOutputStream("Bank_Reference.ser"); ObjectOutputStream o = new ObjectOutputStream(f); o.writeObject(bank); } private Bank loadBank() throws IOException, ClassNotFoundException { // read "bank" Object Reference from File FileInputStream fi = new FileInputStream("Bank_Reference.ser"); ObjectInputStream oi = new ObjectInputStream(fi); // read the object from the file and cast it to a Bank Instance return (Bank) oi.readObject(); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 80 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> SFSB Stateful Session Bean ► zustandsbehaftet H Singleton Lerninhalte Singleton Parallelität Asychronität © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 81 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Singleton Bean 10 Singleton Bean - eine einzige Bean Instanz pro Applikation - verteillt ►eine Bean Instanz pro VM Lösung ► SFSB mit dem Lifecycle einer SLSB Annotation @Singleton ► C Parameter Beschreibung Typ mappedName Name der referenzierten Ressource im globalen Namensdienst String name Name, unter dem die referenzierte Ressource im lokalen Namensdienst (java:comp/env) der Komponente auffindbar sein soll Default String - markiert ein Singleton für eager loading während der Initialisierung der Applikation Annotation @Startup ► C - definiert eine Abhängigkeit zwischen Singleton ► bei der Initialisierung Annotation @DeppendsOn ► C Parameter value Beschreibung Singleton, die vorgängig initialisiert werden müssen Typ Class[] Default Beispile ►Singleton @Startup @Singleton public class HelloWorldBean implenets Hello { public String echo(String echo) { return "Server Echo : " + echo; } } @Singleton @DependsOn("HelloWorldBean") public class GoodbyWorldBean { public String echo(String echo) { return "Server Echo : " + echo; } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 82 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Singleton Bean 10.1 Parallelität - auch Singletons werden durch Client immer parallel genutzt - Nebenläufigkeit muss definiert werden ► Synchronisation - durch den Container ► CMC Container-Managed-Concurrency - durch die Bean ► BMC Bean-Managed-Concurrency - definiert Verhalten bei Nebenläufigkeit für eine SFSB oder eine Singleton Bean Annotation @ConcurrencyManagement ► C Parameter Beschreibung Beschreibung Typ CONTAINER: die Nebenläfigkeit wird durch den Container garantiert BEAN: die Nebenläfigkeit wird durch die Bean garantiert value Default ConcurrencyManagementType CONTAINER - definiert Verhaltung bei Nebenläufigkeit für eine Singleton Methode Annotation @Lock ► M Parameter Beschreibung Typ value WRITE: definiert exclusiven Zugriff auf die Bean Instanz READ: nur lesenden Zugriff LockType WRITE 10.2 Default Asynchroner Aufruf - Session Beans können asynchrone Business-Methothen anbieten - Zustellung garantiert - nach dem COMMIT der Transaktion - persistent - überlebt Serverrestart - konfigurierbar ► void oder Future<V> als Return - Interface Future kapselt das Ergebnis einer asynchronen Berechnung und bildet den Lebenszyklus eines Tasks ab - auf (EJB) Klassen und für Methoden Annotation @Asynchronous ► M @Statless public class AsyncHelloWorldBean implenets AsyncHello { @Asynchronous public Future<String> echo(String echo) { // write "konto" Object Reference to serialized File return new javax.ejb.AsyncResult<String> "Server Echo : " + echo; } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 83 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Singleton Bean Aufgabe ► BeanBean-Instanz HitHit-Counter - erstellen Sie eine Singleton Bean um die Zugriffe zu zählen Ansatz @Singleton public class HitCounter { private long hits; @PostConstruct public void resetCounts() { hits = 0; } public void incCount() { hits++; } @Lock(LockType.READ) public long tellHits() { return this.hits; } } @Stateless public class BankBean implements Bank { @EJB private HitCounter hitCounter; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 84 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Singleton Bean I Messaging Lerninhalte JMS API Messaging Topic vs. Queue Message Driven Lebenszyklus © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 85 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging 11 Messaging - unterstützt asynchrone Kommunkationsmodelle - Point-To-Point ► Queue - Publish / Subscribe ► Topic - unterstützt Entkoppelung - Verteilungsaspekt 11.1 synchron P1 P2 asynchron P1 P2 BROKER JMS API Java Messaging Service - API für den Zugang zu Messaging-Systemen - definiert Schnittstelle - als Factory - Message als - Text Bytes Streams Objects Maps Nachrichten erzeugen mit der JMS API Das Erzeugen und Absenden einer Nachricht über JMS erfolgt in sechs Schritten: 1. Treiber lokalisieren 2. Verbindung erzeugen 3. Session erzeugen 4. Destination lokalisieren 5. Consumers oder Producers erzeugen 6. Nachricht senden oder Nachricht empfangen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 86 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging Lokalisieren des JMS-Treibers - Treiber für das verwendete JMS-Produkt laden ► Maven - lookup(CONNECTION_FACTORY) - CONNECTION_FACTORY ist JNDI-Name des Treibers - implementiert die Schnittstelle ConnectionFactory Erzeugen der JMS-Verbindung - aktive Verbindung zu einem JMS-Provider erzeugen - kapselt die Netzwerk-Kommunikation - Analog zu JDBC wird der Treiber verwendet, um eine Connection anzufordern - TopicConnection - QueueConnection Erzeugen einer JMS Session - JMS Session ist ein Hilfsobjekt, um Nachrichten zu senden oder zu empfangen - legt die Eigenschaften des Nachrichtenaustauschs fest - integriert den Nachrichtenaustausch in eine Transaktion - TopicSession / QueueSession Lokalisieren einer JMS Destination - JMS Destination ist ein Kommunikationskanal - sendet Nachrichten - empfängt Nachrichten - die Auswahl des Kanals erfolgt über ein lookup(CHANNEL) - CHANNEL ist JNDI-Name des Kanals - wird meist durch Applikationserver zur Verfügung gestellt Erzeugen eines JMS Consumers oder eines JMS Producers - Empfänger oder Sender Senden oder Empfangen der Nachricht - Typen von Nachrichten - Text, Bytes, Streams, Objects oder Maps - Nachricht wird instantiiert - Nachricht wird über den Producer gesendet - Nachricht wird über den Consumer empfangen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 87 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging jedes Interface hat zwei Ausprägungen, analog zu den beiden Kommunikationsmodellen JMS API Interface PointPublishPoint-ToTo-Point Publish-Subscribe Subscribe QueueConnectionFactory TopicConnectionFactory ConnectionFactory Queue Connection TopicConnection Connection Queue Topic Destination QueueSession TopicSession Session QueueSender TopicPublisher MessageProducer TopicSubscriber MessageConsumer QueueReceiver, -Browser © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 88 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging 11.2 JMS in JEE implementiert - EJB Container ist Broker - stellt Topics / Queues zur Verfügung 11.2.1 MDB Topic / Queue anlegen - über JBoss admin-console erstellen - jms/testTopic - jms/testQueue Global JNDI Namespace +- jms (class: org.jnp.interfaces.NamingContext) | +- testQueue (class: org.hornetq.jms.client.HornetQQueue) | +- testTopic (class: org.hornetq.jms.client.HornetQTopic) | Aufg Aufgabe ► Topic / Queue bereitstellen - erstellen Sie Topics / Queues - über die Admin-Konsole des Applikationsserver per XML Deklaration - JBoss Admin Console ► http://localhost:8080/admin-console - User Name ► admin - Password ► admin - XML Deklaration ► hornetq-jms.xml - <jboss server>\server\jee\deploy\hornetq\hornetq-jms.xml <queue name="ChatQueue"> <entry name="jms/queue/chat"/> </queue> <topic name="SaldoBelowZeroTopic"> <entry name="jms/topic/SaldoBelowZero"/> </topic> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 89 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging 11.3 Message Driven Bean - Session Beans sind Remote-Procedure-Call basierte Komponenten - werden immer synchron vom Client aufgerufen - Message-Driven-Bean unterstützt die asynchrone Kommunikation - der Client muss nicht warten, bis der Server die Aufgabe erledigt hat - Message-Bean stellt keine direkte Schnittstelle zur Verfügung - Client sendet eine Nachricht an einen Message-Server (Nachrichten-Server) - MDB ist durch das Deployment beim Messageserver registriert - MDB legt Funktionalität in der onMessage-Methode fest Konfiguration des MDB Annotation @MessageDriven ► C Parameter Beschreibung Typ Default name expliziter Name der Bean String unqualifizierter Klassenname Providerspezifische Properties für die Konfiguration der vom Container realisierten Anbindung der Bean an das Nachrichtensystem mappen des Namens auf einen weiteren implementierungsspezifischen (JNDI)-Namen (nicht im Standard-Umfang der Spezifikation) eine Beschreibung für das Bean ActivationConfigProperty[] [] activationConfig mappedName description messageListener messageListenerListenerInterface für das Nachrichtensystem Interface String String Class Object.class © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 90 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging Konfiguration der ActivationConfig AnnotationProperty @ActivationConfigProperty ► C Parameter Beschreibung Typ acknowledgeMode destination destinationType messageSelector subscriptionDurability 11.4 - Auto-acknowledge = Nachrichten werden vom Container bestätigt und Nachrichten werden nur einmal zugestellt - Dups-ok- acknowledge = Nachrichten werden vom Container bestätigt, es können aber Duplikate vorkommen JNDI der Queue- oder Topic- Destination Typ der Destination: javax.jms.Queue oder javax.jms.Topic Filter für empfangene Nachrichten - NonDurable = Ist MDB nicht bereit so ist die Message verloren - Durable = JMS-Provider speichert Nachrichten bis die MDB bereit ist Default String String String String String Bean Life Cycle Container initiated: @PreDestroy does not exist Methode-Ready-Pool Container initiated: Class.newInstance() Dependency Injection @PostConstruct Container initiated: onMessage() Timeout Callback LifeCycleMethoden Annotation Beschreibung @PostConstruct @PreDestroy onMessage() Timeout Callback Wird vom Container aufgerufen nachdem die Bean durch den Container instanziiert worden ist. Für den Client ist der Aufruf dieser Methode transparent. Ressourcen werden durch den Bean Provider freigegeben. Für den Client ist der Aufruf dieser Methode transparent. Business Methode der MDB Bezieht sich auf eine Container Timer Funktion. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 91 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging Aufg Aufgabe ► Email durch MDB - erstellen und deployen Sie ein ReportMDB - bei negativem Kontosaldo soll über die ReportMDB ein Email versendet werden Ansatz ► BankBean - definieren der fachlichen Logik ► (k.getSaldo() < 0f) @Resource(mappedName = "ConnectionFactory") private static TopicConnectionFactory factory; @Resource(mappedName = "jms/topic/SaldoBelowZero") private static Topic topic; public void withdrawAmount(String name, Float amount) { for (Konto k : kontos) { if (k.getName().equals(name)) { k.setSaldo(k.getSaldo() - amount); if (k.getSaldo() < 0f) contactReportMDB(k); } } } Ansatz ► BankBean.contactReportMDB - definieren der Logik zur asynchroner Kommunikation ► sender.send(msg); private void contactReportMDB(Konto k) { String textMessage = "Balance less than 0 for:" + k.toString(); javax.jms.Connection connect; try { connect = factory.createConnection(); Session session = connect.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer sender = session.createProducer(topic); TextMessage msg = session.createTextMessage(); msg.setText(textMessage); sender.send(msg); connect.close(); } catch (JMSException e) { e.printStackTrace(); } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 92 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging Ansatz ► ReportMDB - definieren der Logik zum Empfang der asynchroner Kommunikation ► MDB @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/topic/SaldoBelowZero"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") }) public class ReportMDB implements MessageListener { public void onMessage(Message message) { System.out.println("\n----------------\n" + "ReportMDB - Got message, sending email\n" + message + "\n----------------"); } } - senden Sie eine Email an einen SMTP Server ► onMessage(Message message) { ... Aufg Aufgabe ► Email senden - testen Sie den Versand von Emails durch ein MDB - testen Sie mit bekannten SMTP Einstellungen Ansatz private void sendMail(Message message) { Authenticator auth = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication("user", "pass"); }}; Properties properties = new Properties(); properties.put("mail.smtp.host", "pop.gmail.com"); properties.put("mail.smtp.auth", "true"); javax.mail.Session session = javax.mail.Session.getDefaultInstance(properties, auth); try { // neue Message erzeugen, konfigurieren und versenden javax.mail.internet.MimeMessage msg = new javax.mail.internet.MimeMessage(session); msg.set... Transport.send(msg); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 93 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging Aufgabe ► Chat mit MDB - erstellen und deployen Sie ein ChatMDB - ChatMDB soll einen Chatroom (Queue) bereitstellen erstellen Sie eine eigene Queue : jms/queue/myChatRoom @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "jms/queue/myChatRoom"), @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "MessageFormat = 'ChatMessage'"), @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge") }) public void onMessage(Message message) { try { TextMessage txtMsg = (TextMessage) message; String text = txtMsg.getText(); System.out.println(text); if (factory != null && topic != null) { Connection connect = factory.createConnection(); Session session = connect.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageProducer sender = session.createProducer(topic); TextMessage msg = session.createTextMessage(); msg.setText(text); sender.send(msg); connect.close(); } else { System.out.println("factory or topic not found"); } } catch (JMSException ex) { ex.printStackTrace(); } } } Swing Client Applikation InitialContext ctx = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) ctx.lookup("ConnectionFactory"); javax.jms.Queue queue = (javax.jms.Queue) ctx.lookup("jms/queue/myChatRoom"); connect = factory.createConnection(); session = connect.createSession(false, Session.AUTO_ACKNOWLEDGE); sender = session.createProducer(queue); new Empfaenger(); String anmelden = "NEW:" + jTextFieldName.getText(); TextMessage msg = session.createTextMessage(anmelden); msg.setStringProperty("MessageFormat", "ChatMessage"); sender.send(msg); class Empfaenger implements javax.jms.MessageListener { public Empfaenger() { InitialContext ctx = new InitialContext(); ConnectionFactory factory = (ConnectionFactory) ctx.lookup("ConnectionFactory"); javax.jms.Topic topic = (javax.jms.Topic) ctx.lookup("jms/testQueue"); Connection connect = factory.createConnection(); Session session = connect.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer receiver = session.createConsumer(topic); receiver.setMessageListener(this); connect.start(); }} © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 94 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Messaging J AOP Lerninhalte Paradigma Begriffe Verwendung Annotations © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 95 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12 Aspektorientiertes Aspektorientiertes Programmieren - Aspektorientierung kapselt wiederholende Aufgaben - Aufgabe einmal programmiert - an mehreren Stellen ausgeführt - AOP trennt Businesslogik von Services - Logging - Transaktions-Management - Sicherheits-Managment - AOP verwaltet zentrale Aufgaben wiederverwendbar - Datenbank-Zugriffe - Caching - Authentisierung Crossross-Cutting Concern - querschnittliche Belange einer Software - erlauben keine Modularisierung ► AOP bietet Lösungsansatz 12.1 Aspektorientierung wiki Aspektorientierte Programmierung (AOP) ist ein Programmierparadigma, Programmierparadigma, eine Methode der ComputerComputerprogrammentwicklung, die anstrebt, verschiedene logische Aspekte eines Anwendungsprogramms (kurz Anwendung) Anwendung) getrennt voneinander zu entwerfen, zu entwickeln und zu testen. Die getrennt entwickelten Aspekte werden dann zur endgültigen Anwendung zusammengefügt. - erlaubt kohäsive (zusammenhängende) Entwicklung - SoC (Separation of Concerns) - trennt Business-Logik von Systemservices - Logging - Auditing - Transaktionsverwaltung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 96 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12.2 Begriffe des AOP - Advice - Cross-Cutting Concern - Softwarecode, der zur Ausführung kommt - Logging - Transaktionsmanagement - JoinPoint - impliziert gegebene Ausführungspunkte für Advise vor Methodenaufruf nach Methodenaufruf bei Exception etc. Advice JoinPoints - PointCut - eingrenzendes Muster vorhandener JoinPoints - als Klassenfilter und Methodenmatcher - definierte Use Cases - ServiceMethoden - DAO Funktionalitäten PointCut - Use Case Begriffe in der Aspektorientierten Programmierung AOP Begriff Aspect Joinpoint Advice Pointcut Target Proxy Weaving Introduction Beschreibung Aufgabe, die an verschiedenen Stellen im Programm benötigt wird, z.B. Logging Punkt im Programmfluss, an dem der Aspect eingreift (z.B. Methoden, Exceptions, etc. Spring erlaubt nur Methoden als Joinpoints) Aktion eines Aspekts am Joinpoint, also der Aspect, der am Joinpoint ausgeführt wird Muster, das den Aspect eingrenzt (als Klassenfilter und Methodenmatcher) Objekt, das Joinpoints zur Verfügung steht (z.B. Parameter der Signature) Proxy-Objekt wird aus dem Target erstellt Weaving beschreibt den Vorgang, aus Targets Proxys zu erstellen - beim Kompilieren (statisches AOP) - zur Laufzeit (dynamisches AOP) ermöglicht einem Target zusätzlich (dynamische) Funktionalität z.B. erkennt das Interface Modifiable Änderungen innerhalb des Targets Dynamisches AOP (weaving zur Laufzeit) hat grundsätzlich schlechtere Performance gegenüber statischem AOP (weaving zur Compilezeit), bietet jedoch mehr Flexibilität. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 97 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12.3 EJBs und AOP EJB Spezifikation erlaubt die Definieren von Interceptoren für: - Klassen - Methoden - Container-Callbacks - Lifecycle Methoden 12.4 Interceptoren wiki Interceptor ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung zur Erweiterung eines Framework oder einer Middleware, Middleware, ohne ohne diese selbst zu verändern. Es fällt in die Gruppe der Configuration Pattern. Nutzung von gemeinsamem Code ► Crosscutting Concern - zentrale Codesegmente für die Applikation - wieder verwendbar - für Session Beans und Message Driven Beans - Interceptoren sind zustandslos - können keine Informationen austauschen - Interceptoren für Geschäftsmethoden - fangen Methodenaufrufe ab - führen zentrale Codesegmente aus - z.B. Logging - Lebenszyklus Callbacks - stellen Callbacks des Containers zur Verfügung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 98 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12.5 Klassenweiter Interceptor - durch Annotation @Interceptors - mit der Interceptor-Klasse als Parameter Annotation @Interceptors ► C Parameter Beschreibung alle Interceptoren, die bearbeitet werden sollen value Typ Default Class[] - gilt für alle Methodenaufrufe innerhalb der Klasse @Stateful @Interceptors(MyInterceptor.class) public class BankBean implements Bank { - Definition von mehreren Interceptors - Aufruf erfolgt in der Reihenfolge der Deklaration @Stateful @Interceptors({Interceptor1.class, Interceptor2.class}) public class BankBean implements Bank { 12.6 InvocationContext - gibt Informationen über den Aufruf der Geschäftsmethode - Parameter Target ContextData - z.B. CallerSubject Interface InvocationContext Parameter Beschreibung getContextData() getContextData() getTarget() getMethod() getParameters() getParameters() proceed() gibt die Context Daten der Invocation oder Lyfecycle Callbacks oder eine leere Map zurück, also stellt eine Map für die Informationsübergabe zwischen den Interceptoren zur Verfügung gibt die Targetinstanz des abgefangenen Clientrequests zurück gibt die Methode aus abgefangenen Clientrequests zurück oder null bei Lifecyxle Callbacks gibt die Parameter des abgefangenen Clientrequests zurück setzt die Parameter des aufgerufenen Targets ruft das ursprüngliche Target oder den nächsten Interceptor auf © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 99 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12.7 Methoden Intercepter - @AroundInvoke leitet sämtliche Methodenaufrufe durch die Interceptor Methode - Aufrufparameter können analysiert werden ► auch manipuliert - Signature der Interceptor-Methode ist unabhängig von EJB Interface - Verkettung mehrerer Interceptoren Methoden ist möglich - nur ein Interceptor pro Klasse erlaubt - Funktionen des Interface InvocationContext enthält Informationen der aufgerufenen Methode - proceed() definiert den weiteren Ablauf - nächste Interceptor-Methode / ursprünglich aufgerufene Methode - stoppt den funktionellen Ablauf ► z.B. Sicherheitsverhalten festzulegen - daher auch throws Exception ► als unchecked Exception - Return Type Object erlaubt Manipulation der Parameter @AroundInvoke public Object abfangen(InvocationContext ic) throws Exception { System.out.println(ic.getMethod().getName() + " () wird aufgerufen"); return ic.proceed(); } Ablauf - bei verschachteleten Interceptoren - Cient ruft Business Methode auf ► Proxy erzeugt InvocationContext und ruft diesen auf - InvocationContext ruft Interceptor 1 auf ► Interceptor 1 beendet mit proceed() - InvocationContext ruft Interceptor n auf ► Interceptor N beendet mit proceed() - InvocationContext ruft EJB auf © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 100 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12.8 Lifecycle-Callback Interceptor - allgemein definierte Lifecycle-Methode ► wieder verwendbar, z.B. PostActivate - als Interceptor annotiert ► Signature muss eingehalten werden - in eigener Interceptor-Klasse definiert - durch Lifecycle Annotation markiert @PostActivate void intercept(InvocationContext ic) throws Exception Interceptors Geschäftsmethoden vs Lebenszyklus-Ereignisse Typ für Geschäftsmethoden für LebenszyklusLebenszyklus-Ereignisse alle oder einzelne Methoden Lifecycle Methoden Kontext Bean- oder Interceptor-Klasse definiert in Interceptor-Klasse Signature void <methode>(Invocationcontext) Annotation Bean-Klasse ► @Interceptors Interceptor-Klasse ► @AroundInvoke Bean-Klasse ► void<methode>() Interceptor-Klasse ► <methode>(Invocationcontext) Bean-Klasse ► @Interceptors vor der Bean-Klassendefinition! Interceptor-Klasse ►Callback-Annotation Verwendung der Container Callbackmethoden als Interceptoren Callback Methoden des EJB Containers Callback Package -Bean Stateless SessionStateful SessionMessageDrivenStateless SessionStateful SessionMessageDriven- @PostConstruct javax.annotation @PreDestroy javax.annotation @PostActivate javax.ejb Stateful Session- @PrePassivate javax.ejb Stateful Session- javax.ejb Stateless SessionStateful SessionMessageDriven- @Timeout Beschreibung nach der Instanziierung nach Dependency Injection vor der Business-Methode vor dem Beenden der Instanz nach Reaktivierung der Bean aus dem Sekundärspeicher vor Passivierung der Bean in den Sekundärspeicher durch Timeout eines Timers © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 101 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren 12.9 Interceptoren ausschliessen - @ExcludeClassInterceptors unterdrückt alle für die Klassen definierten Interceptoren auf Methodenebene - gilt nicht für @AroundInvoke annotierte Methoden @ExcludeClassInterceptors public float tellRate() { return rate; } - @ExcludeDefaultInterceptors unterdrückt alle im Deploymentdescriptor definierten Default-Interceptoren @ExcludeDefaultInterceptors @Interceptors(TimingInterceptor.class) @Stateful @Remote(Bank.class) public class BankBean implements Bank { Aufgabe ► Timelogger mit Inteceptor - implementieren Sie einen Zeitlogger für die Servermethoden per Interceptor - Ausgabe auf der Konsole oder in einer Logdatei Call Call Call Call Call Call Call to to to to to to to fascade.BankBean.createAccount took 57 Micros fascade.BankBean.createAccount took 12 Micros fascade.BankBean.calculate took 29 Micros fascade.BankBean.calculateRate took 3164 Micros fascade.BankBean.getAccountBalance took 12 Micros fascade.BankBean.tellRate took 12 Micros fascade.BankBean.getSaldo took 45 Micros Ansatz ► BankBean @Interceptors(TimingInterceptor.class) @Stateful public class BankBean implements Bank { ... © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 102 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren Ansatz ►TimingInterceptor - Vor- und Nachbearbeitung durch Interceptor ► @AroundInvoke - derfinierte Signature ► public Object timing(InvocationContext ctx) throws Exception import static java.util.concurrent.TimeUnit.NANOSECONDS; public class TimingInterceptor { @AroundInvoke public Object timing(InvocationContext ctx) throws Exception { long invoke = System.nanoTime(); String classInvoked = "", methodInvoked = ""; try { classInvoked = ctx.getTarget().getClass().getName(); methodInvoked = ctx.getMethod().getName(); return ctx.proceed(); } finally { long time = System.nanoTime() - invoke; System.out.println("Call to " + classInvoked + "." + methodInvoked + " took " + NANOSECONDS.toMicros(time) + " Micros"); } } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 103 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Aspektorientiertes Programmieren K Timer Service Lerninhalte Eigenschaften Ablauf Timer Schnittstellen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 104 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service 13 Timer Service Kontainer Funktionalität um zu vorprogrammierten Zeiten einen Vorgang auszuführen: - Löschung verwaister Daten - jede Nacht alle Datensätze, die älter als eine Woche sind, löschen - Reporting - Bericht über die täglich versendete Anzahl Emails - Monitoring - Überprüfung ob ein Dienst (EJB) zur Verfügung steht - Remainder - Nachrichten senden bis eine Rückmeldung eintrifft - Workflow - anstehende Aufträge in eine Warteschlange stellen Transak ransaktionen tionen - ein Timer wird durch eine EJB erzeugt - 13.1 EJBs laufen in einem transaktionalen Umfeld - transaktionaler Rollback löscht den Timer wieder Eigenschaften - Timer Service für Container Komponenten ► EJBs - Batch Jobs duch den Container gestartet und verwaltet - als Kurzzeit-Timer ungeeignet - Container benachrichtigt EJB ► welches Timer definiert hat - Stateless Session Bean - Message Driven Bean - Timer EJB führt die mit @Timeout annotierte Methode aus - Timer EJB ist Stateless - Container führt beliebige Instanz der EJB aus @Schedule - @Schedule bietet vereinfachte Timer Funktion für EJBs - annotierte Bean Methode wird durch cron-ähnlicher Syntax getriggert © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 105 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service 13.2 13.3 Ablauf Timer starten - Timer erzeugen ► Praxis: durch ein SLSB - über EJB Kontext – TimerService ts = SessionContext.getTimerService() - über Injection - @Resource javax.ejb.TimerService ts @Resource SessionContext sc; public void setUpTimer() { TimerService ts = sc.getTimerService(); long min15 = 15 * 60 * 1000; // 15 Min * 60 Sec * 1000 mSec Timer t = ts.createTimer(min15, min15, "in_und_alle_15_Minuten"); } @Resource TimerService timerService; public void setUpTimer() { long std1 = 60 * 60 * 1000; // 60 Min * 60 Sec * 1000 mSec Timer t = timerService.createTimer(sec5, "einmal_in_1_Stunden"); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 106 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service createTimer(long d, Serializable info) - long tenDays = 1000 * 60 * 60 * 24 * 10 - createTimer(tendays,null) periodisch einmalig relativ Methode absolut folgende Methoden stehen zum Erstellen eines Timers zur Verfügung: TimerService create Methoden createTimer(long d, long interval, Serializable info) - long oneMinute = 1000 * 60 * 1 - long oneHour = 1000 * 60 * 60 - createTimer(oneMinute, oneHour, null) createTimer(Date expiration, Serializable info) - Calendar Date = Calendar.getInstance() - date.set(2008, Calendar.JANUARY, 1) - createTimer(date.getTime(), null) createTimer(Date ex, long interval, Serializable info) - Calendar Date = Calendar.getInstance() date.set(2008, Calendar.JANUARY, 1) long oneWeek = 1000 * 60 * 60 * 24 * 7 createTimer(date.getTime(), oneWeek, null) 13.4 Timer ausführen - Container ruft @Timeout annotierte Methode beim definierten Zeitintervall auf @Timeout public void fire(Timer timer) { String info = timer.getInfo(); } Timer beenden - Timer sind persistent - überleben einen Server-Restart timer.cancel() löscht den definierten Timer Service public void stopAllMonitors() { for (Object o : timerService.getTimers()) { // cancel all TimerServices Timer timer = (Timer) o; timer.cancel(); } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 107 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service 13.5 Timer Schnittstellen - TimerService ► zum Verwalten des Timers - Timer ► aktuelles zeitgesteuertes Objekt Methoden des TimerService Interface Interface TimerService Methoden Beschreibung Methoden createTimer( createTimer(...) ...) verschiedene Methoden zum Erzeugen des Timers liefert alle Timer, die für ein bestimmtest Bean registriert wurden. getTimers() Methoden des Timer Interface Interface Timer Methoden cancel() cancel() getTimeRemaining() getNextTimeout() getSchedule() getHandle() / getInfo() isPersitent() isCalendarTimer() Beschreibung Timer kann beendet werden verbleibende Zeitspanne Zeitpunkt des nächsten Timeout liefert das ScheduleExpressionObject zurück liefert serialisierbare Referenz des Timerobjekt liefert serialisierbares InfoObjekt des Timerobjekt liefert entsprechend boolschen Wert liefert entsprechend boolschen Wert © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 108 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service 13.6 Automatische Timer - Container richtet bei Bedarf automatisch einen Timer ein - javax.ejb.TimedObject entfällt - Timer Callbacks exitieren - Timerausdrücke mit cron-ähnlicher Syntax @Schedule(second="30") public void saldoAusgeben() { ... } Annotation @Schedule ► Parameter Bereich dayOfMonth, dayOfWeek String String hour, hour, minute, second String year, month String info boolean persitent String timezone M Beispiel dayOfMonth = "7-3", dayOfWeek = "Fri-Mon" second = "10,20,30" minute = "0-10,30,40", minute = "*/5" month="Nov" Literal das den Timer beschreibt true / false timezone = "America/New_York" Beispiele Beispiele - mehrere automatische Timer erzeugen @Schedules({ @Schedule(hour = "10", dayOfWeek = "Mon-Fre"), @Schedule(hour = "12", dayOfWeek = "Mon-Fre"), @Schedule(hour = "14", minute="30", dayOfWeek = "Mon-Fre") }) public void sendBreakNotification() { System.out.println("Zeit für eine Pause ..."); } - nicht persistenter Timer ist an den JVM Lebenscyklus gebunden @Singleton public class CacheBean { // erneuert den Singleton Cache alle 10 Minuten @Schedule(minute=”*/10”, hour=”*”, persistent=false) public void refresh() { ... - ScheduleExpression definiert: "jeden Samstag um 13.00" ScheduleExpression schedule = new ScheduleExpression().dayOfWeek("Sat").hour(1); Timer timer = timerService.createCalendarTimer(schedule); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 109 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service Aufgabe ► SimpleEJBTimer - Singleton als EJB Timer @Singleton public class MyTimerService { @EJB HelloService helloService; @Schedule(second = "*/1", minute = "*", hour = "*", persistent = false) public void doWork() { System.out.println("timer: " + helloService.sayHello()); } } @Stateless public class HelloService { public String sayHello() { return "Service invoked by MyTimerService > " + System.currentTimeMillis(); } } Aufgabe ► InterestMonitor mit EJB Timer - SLSB als EJB Timer soll den Zins aller summierten Kontensaldi ausgeben @Singleton public class InterestMonitorBean { @PostConstruct private void getSaldoFromAccounts() { ... } @Schedule(second = "*/15", minute = "*", hour = "*", persistent = false) public void calculateInterest(Timer timer) { // 15 sec pro Jahr > 4,7564688 × 10-7 = 0.00000047564688 this.currentSaldo += rate.calculate(this.startSaldo, 1) * 0.00000047564688; DecimalFormat df = new DecimalFormat("#,###,##0.00"); System.out.println("Interest gained : " + df.format(currentSaldo) + " on Amount " + df.format(startSaldo) + " with " + df.format(rate.getRate()) + " % Interest"); } INFO INFO INFO [STDOUT] Interest gained : 0.01 on Amount 935.80 with 12.50 % Interest [STDOUT] Interest gained : 0.03 on Amount 935.80 with 12.50 % Interest [STDOUT] Interest gained : 0.05 on Amount 935.80 with 12.50 % Interest © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 110 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Timer Service L Web Service Lerninhalte Definition Begriffe Szenarien Anwendung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 111 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Webservice 14 Webservice wiki Das World Wide Web Consortium definiert die Bereitstellung eines Webservices als Unterstützung zur Zusammenarbeit zwischen verschiedenen Anwendungsprogrammen, Anwendungsprogrammen, die auf unterschiedlichen Plattformen und/oder Frameworks betrieben werden. Ein Webservice oder Webdienst ist eine SoftwareSoftware-Anwendung, die mit einem Uniform Resource Resource Identifier (URI) eindeutig identifizierbar ist und deren Schnittstelle als XMLXML-Artefakt definiert, beschrieben und gefunden werden kann. Ein Webservice unterstützt die direkte Interaktion mit anderen SoftwareSoftware-Agenten unter Verwendung XMLXML-basierter Nachrichten Nachrichten durch den Austausch über internetbasierte Protokolle. Protokolle. Beispiel WSDL - generiert durch JBoss - http://localhost:8080/Bank/ZinsBean?wsdl <wsdl:message name="calculateResponse"> <wsdl:part name="ertrag" type="xsd:double" /> </wsdl:message> <wsdl:message name="calculate"> <wsdl:part name="betrag" type="xsd:double" /> <wsdl:part name="zins" type="xsd:double" /> <wsdl:part name="jahre" type="xsd:int" /> </wsdl:message> 14.1 Szenarien - Session Bean stellt WebService zur Verfügung - @WebService exportiert alle Methoden der Bean - @WebMethod annotiert die zu exportierende Methode - AS (JBoss) erstellt WSDL beim Deployment - SessionBean ist Client für WebService - WSDL Datei (Beschreibungsdatei für den WebService) steht zur Verfügung - Session Bean implementiert SEI (Service Endpoint Interface) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 112 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Webservice 14.2 Definition eines Web Service - @WebService definiert eine Klasse als Webservice - macht alle öffentlichen Methoden sichtbar Annotation @WebService ► C, M Parameter Beschreibung vollqualifizierter Name des Service-Endpoint- endpointInterface Interface Name des Port-Typs innerhalb der WSDLDefinition Name des Webservice-Ports innerhalb der PortName WSDL-Definition Name des Webservices innerhalb der WSDLserviceName Definition Namensraum für Port-Typ und untergeordnete targetNamespace Elemente Angabe einer WSDL-Datei um eine automatische Generierung zu verhindern wsdlLocation (eigene Definition zu verwenden) name Typ Default String String implementierenden Klasse String [name] String [name] String String Aufgabe ► WebService zur Zinsberechnung - offerieren Sie die Zinsberechnung des SLSB ZinsBean als WebService - ServiceEndpoint Interface deklariert WebService Schnittstelle @WebService @SOAPBinding(style = SOAPBinding.Style.RPC) public interface RateServiceEndpoint extends Remote { @WebMethod public @WebResult(name = "ertrag") float calculate(@WebParam(name = "betrag") float amount, @WebParam(name = "zins") float rate, @WebParam(name = "jahre") int years) throws RemoteException; } - WebServiceZins Bean implementiert WebService Schnittstelle @WebService(endpointInterface = "zins.RateServiceEndpoint") @Stateless(mappedName = "ejb/zins", name= "RateBean") public class ZinsBean implements Zins, RateServiceEndpoint { ... } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 113 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Webservice - generierte WSDL Datei ►http://localhost:8080/Bank/ZinsBean?wsdl - JUnit Test @Before public void setUp() throws Exception { URL url = new URL("http://127.0.0.1:8080/Bank/ZinsBean?wsdl"); QName qname = new QName("http://zins/", "ZinsBeanService"); ServiceFactory factory = ServiceFactory.newInstance(); Service service = factory.createService(url, qname); se = (RateServiceEndpoint) service.getPort(RateServiceEndpoint.class); assertNotNull(se); assertTrue(se instanceof RateServiceEndpoint); } @Test public void calculateZins() throws Exception { assertEquals(result, se.calculate(amount, rate, years), 0.05); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 114 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Webservice M EJB Security Lerninhalte Architektur Begriffe Rollen Realm RoleMapping Deployment Descriptor Security Elemente Annotationen Security Domänen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 115 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security 15 JEE Security - "so wenig wie möglich" programmatische Sicherheit in die Beans - mehr deklarative Sicherheitseinstellungen über den Container 15.1 JAAS (Java Authentication and Authorization Service) Securitythematik - Authentifizierung von Clients - sichere Kommunikationsformen zwischen Client und Server - sichere Kommunikation zwischen Containern - Security Identity Propagation - rollenbasierter Zugriffsschutz innerhalb des Systems Weiterreichen der Identität eines EJB-aufrufenden Client Securitybereitstellung - Applikation-Client-Authentisierung - über JAAS Java Authentication and Authorisation Service - Client wird bei Anmeldung am System als unidentifiziertes Subjekt angesehen - nach erfolgreicher Authentisierung werden Client-Subject Principals und Credentials zugeordnet - Principals werden über das java.security.Principal-Interface implementiert assoziieren das Client-Subject mit einem Benutzernamen oder –konto sicherheitsrelevante Daten wie etwa ein Kerberos-Ticket Loginpasswort - Principals werden später bestimmten Rollen zugeordnet - principal-to-role-mapping - Teil der umzusetzenden Sicherheitspolitik © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 116 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security 15.2 Security Roles Security Rollen werden in verschiedenen Entwicklungsbereichen definiert. Bean Provider (EJB(EJB-Entwickler) - "so wenig wie möglich" Sicherheitsfragen - Sicherheitspolitik nicht hart im Code eingebettet - später über den Container kontrollierbar und konfigurierbar - "programmatische Sicherheit" als Alternative - Rollen müssen im Deployment Descriptor referenziert sein public void withdrawMoney(float inAmount) { if (inAmount < 1000f) { accountBalance -= inAmount; @Resource } else if (sc.isCallerInRole("admin")) { SessionContext sc; accountBalance -= inAmount; } else { System.out.println("Withdraw Denied for: " + sc.getCallerPrincipal()); } Application Assembler - stellt EJB-Komponenten zusammen - deklariert Sicherheitsrollen <assembly-descriptor> <security-role> <role-name>trustee</role-name> </security-role> <security-role> <role-name>owner</role-name> </security-role> <assembly-descriptor> - deklariert die Rechte der einzelnen Methoden - Name der erlaubten Methodensignature ► * um alle Methoden für eine Rolle freizugeben <method-permission> <role-name>trustee</role-name> <method> <ejb-name>BankBean</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>owner</role-name> <method> <ejb-name>BankBean</ejb-name> <method-name>depositAmount</method-name> </method> <method> <ejb-name>BankBean</ejb-name> <method-name>withdrawAmount</method-name> </method> <method> <ejb-name>BankBean</ejb-name> <method-name>getSaldo</method-name> </method> <method-permission> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 117 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security Deployer - mappt die Systemrollen den Rollen des Beanproviders zu - ist auf gute Spezifikation des Assemblers angewiesen muss die Rollenreferenzen des Programmierers kennen <security-role-ref> <role-name>trustee</role-name> <role-link>admin</role-link> </security-role-ref> - um programmatische Sicherheit zu ermöglichen - EJBContext.getCallerPrincipal - EJBContext.isCallerInRole - 15.3 SessionContext.getCallerPrincipal SessionContext.isCallerInRole Client-Tier Sicherheit ApplicationClients - JAAS implementiert Pluggable Authentication Module (PAM) Frameworks - erlaubt den Einsatz von eigens entwickelten Loginmodulen Loginmodule werden auf Seiten des Clients eingesetzt verschiedene Loginvarianten werden unterstützt - Name/Passwort-Dialoge - externer Hardware und Smartcards - Zertifikate weiterreichen - Loginmodule steuern Loginvorgang - sammeln Authentifizierungsdaten über Callbackhandler - Statusinformationen vom Server werden an den Client zurückgereicht - durch Interface javax.security.auth.callback.CallbackHandler AppCallbackHandler handler = new AppCallbackHandler(name, password); LoginContext lc = new LoginContext("FileRealmSecurityDomain", handler); lc.login(); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 118 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security 15.4 JNDI Sicherheit - Login Spoofing - unberechtigte JNDI Server Einträge - sichere Verbindung zum Name-Services Properties env = new Properties(); env.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); env.setProperty(Context.URL_PKG_PREFIXES, "org.jboss.security.jndi.JndiLoginInitialContextFactory"); env.setProperty(Context.PROVIDER_URL, "jnp://localhost:1099/"); env.setProperty(Context.SECURITY_PRINCIPAL, user); env.setProperty(Context.SECURITY_CREDENTIALS, password); InitialContext ctx = new InitialContext(env); ... 15.5 Realms realm [Engl.] für Bereich - Realms definieren einen Bereich, in dem sich eine Gruppe von Benutzern authetifizieren 15.6 LDAP (Lightweight Directory Access Protocol) Server Datenbank Dateien Legacy Tier Security - authentifizieren von Container bzw. Beans gegenüber Legacy-Systemen - wie Datenbanken oder Gateways - Container-Managed - Bean-Managed © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 119 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security 15.7 Declarative vs Programmatische Security Web Tier Web Resources web.xml deklarative programmatische Sicherheit Sicherheit EJB Tier Bean Methods Zugriffskontrolle ejb-jar.xml Deklaration Deployment Descriptor Programm Web Container EJB Container Umsetzung Container Programm Servlet / JSP Codierung "all or nothing" Logikbasiert 15.8 EJB Bean JEE Security Architecture - Hardware Security - SSL, Zertifakte, Schlüssel, etc. - Container Security - Authentifierung von Principals - Komponenten Security - Rollenbasierte Methodenzugriff Role Mapping - definiert durch Pricipal, Groupen und Rollen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 120 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security 15.9 ejb-jar.xml Security Deployment Descriptor Security Elemente Architektur Design - feingranulare Architektur - lose gekoppelte Komponenten - XML Deployment ist vorteilhaft 15.10 Security Annotations - Security kann auch annotiert werden Annotation Typ Methode Klasse EJB Security @PermitAll @DenyAll @RolesAllowed @DeclaredRoles @RunAs Beschreibung alle Rollen bekommen Zugriff sinnvoll bei geerbter Security selektioniert Methodenzugriff per Liste definiert Methodenzugriffe per Liste legt die Rolle zur Ausführung fest, ungeachtet der Client Authorisierung Die Securitydomäne wird Serverspezifisch definiert: org.jboss.ejb3.annotation.SecurityDomain @SecurityDomain definiert Securitydomäne © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 121 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security 15.11 RunAS - definiert das weitere Security-Verhalten Annotation @RunAs ► C Parameter Parameter Beschreibung Name der Rolle, die verwendet werden soll value Typ Default String - Methoden der Klasse ZinsBean benötigen die Rolle "owner" oder "trustee"damit sie ausgeführt werden können - Methoden der Klasse ZinsBean werden in der Rolle "admin" ausgeführt @SecurityDomain("FileRealmSecurityDomain") @RolesAllowed({"owner", "trustee"}) @RunAs("admin") @Stateless(mappedName = "ejb/zins", name= "RateBean") public class ZinsBean implements Zins { ... } 15.12 Security Domain wiki A Security Domain is the the determining factor in the classification of an enclave of servers / computers. A network with a different security domain is maintained separate from other networks. - EJBs müssen Teil einer Security Domain sein - Konfiguraion ist abhängig von der Infrastulktur JBoss AS (spezifisch) - auth.conf - definiert LoginModul ist Teil des Client Classpath - login-config.xml - definiert Realm - im <server>/conf Verzeichnis "other" ist die Standard JBoss Security Domäne © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 122 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security Security Domain definieren - annotiert - deklarativ Annotiert - @SecurityDomain import org.jboss.ejb3.annotation.SecurityDomain; @Stateful @SecurityDomain("FileRealmSecurityDomain") @RolesAllowed({ "owner", "trustee" }) public class BankBean implements Bank { ... } - referenziert ►[JBoss_Home]/server/[server]/conf/login-config.xml <application-policy name="FileRealmSecurityDomain"> <authentication> <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule" flag="required"> <module-option name="usersProperties">bank-users.properties</module-option> <module-option name="rolesProperties">bank-roles.properties</module-option> </login-module> </authentication> </application-policy> Deklarativ - jboss.xml <jboss> <security-domain>java:/jaas/FileRealmSecurityDomain</security-domain> <unauthenticated-principal>guest</unauthenticated-principal> </jboss> - entsprechend ejb-jar.xml <assembly-descriptor> <security-role> <role-name>trustee</role-name> </security-role> <security-role> <role-name>owner</role-name> </security-role> <method-permission> <role-name>trustee</role-name> <method> <ejb-name>BankBean</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>owner</role-name> <method> <ejb-name>BankBean</ejb-name> <method-name>depositAmount</method-name> </method> ... © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 123 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security Realms definieren - Security Domain definiert Realms ► LDAP, DB, Dateien - definieren User und entsprechende Rollen definieren den Zugriff auf User und entsprechende Rollen - Datei [JBoss_Home]/server/[server]/conf/login-config.xml definiert bestehende Domains Database-Server-Login-Modul <application-policy name = " MySqlRealmSecurityDomain "> <authentication> <login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule" flag = "required"> <module-option name = "unauthenticatedIdentity">guest</module-option> <module-option name = "dsJndiName">java:jdbc/account</module-option> <module-option name = "principalsQuery">SELECT password FROM users WHERE user=?</module-option> <module-option name = "rolesQuery">SELECT role,'Roles' FROM roles WHERE roles.user=?</moduleoption> <module-option name = "debug">true</module-option> </login-module> mysql> select * from roles; mysql> select * from users; </authentication> +-----------+-----------+ +-----------+---------+ </application-policy> - entsprechende DB Schema - MySqlDB.users / MySqlDB.roles 15.13 | user | password | +-----------+-----------+ | kunde | kunde | | verwalter | verwalter | +-----------+-----------+ 2 rows in set (0.00 sec) | user | role | +-----------+---------+ | verwalter | trustee | | kunde | owner | +-----------+---------+ 2 rows in set (0.00 sec) Zusammenfassung EJB Security definiert rollenbasiertes Sicherheitsmodell - Clients mit entsprechenden Rollen bekommen Zugriff auf Methoden - annotiert - deklarativ - programmatisch - auf Session- und MessageDrivenBeans anwendbar - Zugriffsrechte auf EJB Methoden festlegen - ejb-jar.xml Deployment Descriptor - Annotation Annotierte Sicherheit - Security Domain und Zugriffsrechte deklarieren @Stateful @SecurityDomain("MySqlRealmSecurityDomain") @RolesAllowed({ "owner", "trustee" }) public class BankBean implements Bank { © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 124 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security Deklarative Sicherheit - Zugriffsrechte festlegen ► ejb-jar.xml ► Security Roles deklarieren <security-role> <role-name>trustee</role-name> </security-role> <security-role> <role-name>owner</role-name> </security-role> - Method Permission deklarieren <method-permission> <role-name>trustee</role-name> <method> <ejb-name>BankBean</ejb-name> <method-name>*</method-name> </method> </method-permission> <method-permission> <role-name>owner</role-name> <method> <ejb-name>BankBean</ejb-name> <method-name>depositAmount</method-name> </method> <method> <ejb-name>BankBean</ejb-name> <method-name>withdrawAmount</method-name> </method> </method-permission> Programmatische Sicherheit - Zugriffsrechte festlegen ► ejb-jar.xml <security-role> <role-name>verwalter</role-name> </security-role> <security-role> <role-name>kunde</role-name> </security-role> - Security Role Reference deklarieren <security-role-ref> <role-name>verwalter</role-name> <role-link>admin </role-link> </security-role-ref> - Bean-Methoden Implementierung entscheidet über Zugriff public void withdrawAmount(String name, Float amount) { if (amount < 1000f | sc.isCallerInRole("admin")) { for (Konto k : kontos) { if (k.getName().equals(name)) k.setSaldo(k.getSaldo() - amount); } } else { System.out.println("Withdraw Denied : Caller is " + sc.getCallerPrincipal()); } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 125 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security Aufgabe ► JAAS - testen Sie JAAS für das BankBean - erstellen Sie Principals, Credentials und entsprechende Rollen - testen Sie verschiedene Realms - Dateien ► im Classpath - bank-users.properties - bank-roles.properties - Datenbank ► per JNDI - MySQL DB - verwenden Sie verschiedene Client-Login Module - JAAS CallbackHandler ► LoginContext - oder auch JBoss SecurityClient import org.jboss.security.client.SecurityClient; import org.jboss.security.client.SecurityClientFactory; SecurityClient client = SecurityClientFactory.getSecurityClient(); client.setSimple(user, password); client.login(); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 126 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JEE Security N Transaktionen Lerninhalte Eigenschaften Steuerung Management Annotationen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 127 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16 Transaktionsmanagement wiki Als Transaktion (von lat. trans „über“, actio zu agere „(durch)führen“) bezeichnet bezeichnet man in der Informatik eine Folge von Operationen, die als eine logische Einheit betrachtet werden. Insbesondere wird für Transaktionen gefordert, dass sie entweder vollständig oder überhaupt nicht ausgeführt werden (Atomarität (Atomarität). Atomarität). Transaktionen werden von Transaktionssystemen verarbeitet; diese erzeugen dabei aus mehreren Transaktionen eine Historie. Transaktionen kommen meist bei Datenbanksystemen zum Einsatz. 16.1 - Transaktion logisch zusammenhängende Folge von Operationen einer Datenbank wird von einem konsistenten in einen weiteren konsistenten Zustand überführt kleinster, unteilbar abzuarbeitender Prozess einer Anwendung werden vollständig oder gar nicht abgearbeitet 16.1.1 Transaktionskonzepte ACIDACID-Eigenschaften - Atomic (atomar) ► eher Up-Quark, Neutrino oder Myon, etc. - eine Transaktion ist Reihe von "primitiven" unteilbaren Operationen es werden entweder alle Operationen ausgeführt oder gar keine - Consistent (konsistent) - Transaktionen hinterlassen die Daten in konsistentem Zustand - Isolated (isoliert) - gleichzeitige Transaktionen beeinflussen sich nicht - Durable (dauerhaft) - abgeschlossene Transaktionen sind dauerhaft Transaktionsverhalten - commit - erfolgreiche Beendigung einer Transaktion die Änderungen sind dauerhaft in der Datenbank abgespeichert ► für alle (User) sichtbar - rollback - Transaktionsabbruch führt Änderungen am Datenbestand zum letzten konsistenten Zustand © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 128 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16.1.2 Lokale und verteilte Transaktionen - lokale Transaktion (local transaction) - nur lokale Daten betroffen - nicht mehrere (Daten)-Ressourcen sind Teil der Transaktion - verteilte Transaktion (distributed transaction) - betreffen mehrere Daten, die auf Verteilten Systemen liegen - müssen in Teiltransaktionen aufgeteilt werden Transaktionsablauf - Business Prozess startet Transaktion 1 - Business Prozess startet Transaktion 2 - Transaktion 1 wird mit commit beendet - Transaktion 2 wird mit commit beendet ► inkonsistente Zustände sind möglich - zweite Commit-Anweisung fällt aus Zwei Phasen Commit 2PC definiert erweitertes Protokoll mit 2 Phasen - Erste Phase - "Prepare-to-Commit" auf allen Knoten - teure Operation - Zweite Phase - sendet ein Commit an die Knoten - billige Operation © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 129 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16.1.3 Isolationsebenen wiki In der Informatik bezeichnet der Begriff Isolation die Trennung von Transaktionen auf eine Weise, dass eine laufende Transaktion nicht von einer parallel ablaufenden ablaufenden Transaktion durch Änderung der benutzten Daten in einen undefinierten Zustand gebracht werden kann. Die Isolation ist eine der vier ACIDACID-Eigenschaften. - komplette Serialisierung der transaktionalen Operationen - sicher, aber teuer - Isolierung ist eine Einschränkung im Vergleich zu idealen ACID Transaktionen - nach ANSI-92 SQL Isolationsebenen Level Beschreibung NONE READ_UNCOMMITTED READ_COMMITTED REPEATABLE_READ SERIALIZABLE 16.1.4 keine Transaktion möglich alle Transaktionen sehen die Änderungen von anderen Transaktionen nicht abgeschlossene Transaktionen sind unsichtbar für andere Transaktionen eine Transaktion sieht nur Daten, die vor ihrem Startzeitpunkt vorhanden waren alle Transaktionen verhalten sich, als würden sie hintereinander abgearbeitet Probleme bei parallelen Datenbankoperationen - Multi-User Applikationen definieren folgende Problem-Szenarien Dirty Read - innerhalb einer Transaktion T1 wird ein Datensatz Z verändert - dieser veränderte Datensatz wird innerhalb einer zweiten Transaktion T2 gelesen - Transaktion T1 mit einem Rollback abgebrochen - die Transaktion T2 arbeitet mit einem ungültigen Wert - Dirty Read dirty read Transaktionsablauf 1 2 User T1 Daten Z User T2 3 UPDATE 10 11 4 5 ROLLBACK 11 SELECT 10 10 SELECT © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 130 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement Non Repeatable Read - innerhalb einer Transaktion T1 wird ein Datensatz Z gelesen - die zweite Transaktion T2 ändert diesen Datensatz Z - die Transaktion T2 wird commited - erneutes Lesen von Z durch die Transaktion T1 ergibt einem ungültigen Wert - Non-Repeatable Read nonrepeatable read Transaktionsablauf 1 2 User T1 Daten Z 3 4 SELECT 10 10 User T2 5 SELECT 11 11 UPDATE COMMIT 11 Phantom Read - die Transaktion T1 liest die Ergebnismenge der Daten Z (count = 2) - die Transaktion T2 verändert die Anzahl Datensätze mit Insert / Delete - die Transaktion T2 wird committed - erneutes Lesen von Z durch die Transaktion T1 ergibt eine ungültige Ergebnismenge - Phantom Read phantom read Transaktionsablauf 1 User T1 Daten Z User T2 2 3 4 SELECT 10 10,11 5 SELECT 11,11,12 11,11,12 INSERT COMMIT 10,11,12 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 131 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement Lost Update Update - innerhalb einer Transaktion T1 wird ein Datensatz Z gelesen - die zweite Transaktion T2 liest denselben Datensatz Z - die Transaktion T1 wird commited - die Transaktion T2 wird commited - erneutes Lesen von Z durch die Transaktion T1 ergibt einem ungültigen Wert - Lost Update lost update Transaktionsablauf 1 2 User T1 SELECT Daten Z 10 3 4 COMMIT 10 User T2 5 SELECT 11 12 SELECT 12 COMMIT mögliche Vorkommen von Datenkonflikten durch Isolationsebenen mögliche Daten-Konflikte Isolationsebene Read Uncommitted Read Committed Repeatable Read Serializable Dirty Read Lost Update Non Repeatable Read Phantom Read - mit zunehmendem Isolationsgrad - sicherere Transaktion - schlechtere Performance, da mehr Sperren innerhalb der Datenbank © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 132 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement kontrollierbar dur durch Lock Strategien - DB LOCK {TABLE | TABLES} <table name> [AS <alias>] {READ [LOCAL] | [LOW_PRIORITY] WRITE} [{, <table name> [AS <alias>] {READ [LOCAL] | [LOW_PRIORITY] WRITE}}...] - Funktionalität public void lock(Object entity, LockModeType lockMode); - Methoden @Lock(LockType.READ) public void getItem(Item i) {.. Lock Strategien - Pessimistic ► vorsorglich sperren - Optimistic ► meistens geht es gut © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 133 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16.2 Propagation wiki Unter Propagation oder Propagierung (von Lateinisch propagare „ausdehnen“) versteht man im weitesten Sinne eine Ausdehnung. Ausdehnung. Propagations Bezeichnung Verhalten PROPAGATION_MANDATORY PROPAGATION_MANDATORY erfordert eine laufende Transaktion ► Exception PROPAGATION_NESTED erfordert eine eigenständige Transaktion PROPAGATION_NEVER erlaubt keine offene Transaktion ► Exception PROPAGATION_NOT_SUPPORTED unterbricht eine offene Transaktion PROPAGATION_REQUIRED PROPAGATION_REQUIRED startet eine neue oder übernimmt eine bestehende Transaktion PROPAGATION_REQUIRES_NEW startet eine neue Transaktion PROPAGATION_SUPPORTS übernimmt eine geöffnete Transaktion - ermöglicht feingranulares Transaktionssverhalten Transaktionspropagation Bezeichnung aufrufende Methode weiterführende Methode NotSupported, Supports, Never Required, RequiresNew Mandatory NotSupported Supports, Required, Mandatory RequiresNew, Nested Never © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 134 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16.3 JTS Java Transaction Service - JTS spezifiziert die Implementierung eines Transaktionsmanagers TransaktionsM TransaktionsManager - realisiert die Koordination von Transaktionen - Start, Abbruch und Abschluss Realisierung globaler, verteilter Transaktionen verwaltet die beteiligten Ressourcen einer globalen Transaktion ► RessourceManger - koordiniert Zwei-Phasen-Commit-Protokoll - kooperiert mit anderen Transaktionsmanagern RessourcenManager - kontrolliert transaktionsunterstützende (XA-kompatible) Ressource 16.4 JTA Java Transaction API - JTA spezifiziert die Programmierschnittstelle - für EJB, JDBC, JMS, JTS - Zugriff erfolgt mit der Java Transaction API Schnittstelle - besteht aus mehreren Interfaces - javax.transaction.UserTransaction - Transaktion starten ► begin() - Transaktion abbrechen ► rollback() - Transaktion abschliessen ► commit() - Transaktionsstatus lesen ►getStatus() - Rollback erzwingen ► setRollbackOnly() - Timeout setzen ►setTransactionTimeout(sec) - javax.transaction.TransactionManager - laufender Transaktionscontext holen ►getTransaction() - laufende Transaktion anhalten ►suspend() - Transaktion wieder aufnemen ► resume(T) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 135 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16.5 Transaktionshandling wiki Als Konsistenz bezeichnet man bei Datenbanken allgemein die Widerspruchsfreiheit von Daten. Daten. Konsistenz ist eine der vier in DatenbankDatenbank-Transaktionen geforderten ACIDACID-Eigenschaften. Eigenschaften. Transaktionen Transaktionen müssen Datenbanken von einem konsistenten in einen anderen konsistenten Zustand überführen. Während der Verarbeitung der Anfrage kann die Konsistenz der Datenbank jedoch durchaus verletzt sein. - ACID-Prinzipien eingehalten ►Konsistenz - EJB-Spezifikation definiert zwei Typen - explizite ► bean-managed transactions - implizite ► container-managed transactions 16.5.1 Bean Managed Transaction steuert Transaktionen explizit ► direkt - durch das JTA Inteface UserTransaction - Transaktionen mit anderen EJBeans - Transaktionen mit Datenbanken über JDBC Deklarativ ► ejb-jar.xml <enterprise-beans> <session> <ejb-name>BankBean</ejb-name> <transaction-type>Bean</transaction-type> <session> <enterprise-beans> Annotiert @TransactionManagement(TransactionManagementType.BEAN) @Stateful public class BankBean implements Bank { ... } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 136 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement Steuerung der Transaktion ► mit UserTransactionUserTransaction-Objekt - als JNDI lookup ic = new InitialContext(); UserTransaction ut = (UserTransaction) ic.lookup("java:comp/env/UserTransaction"); ut.begin(); ... - über SessionContext @Resource SessionContext sc; UserTransaction ut = sc.getUserTransaction(); - über Dependency Injection @TransactionManagement(TransactionManagementType.BEAN) @Stateful public class KontoBean implements Konto { @Resource UserTransaction ut; 16.5.2 Container Managed Transactions - steuert Transaktionen implizit ► indirekt ► durch Container - kein zusätzlicher Code in die Geschäftslogik ► try-catch-Blocks definiert Transaktion - Fehler (catch) führt alle schon durchgeführten Anweisungen zurück ► ROLLBACK - keine verschachtelten Transaktionen möglich CMT für Methoden @TransactionAttribute(TransactionAttributeType.REQUIRED) public void transfereAmount(Konto fromAccount, Konto toAccount, Float amount) { try { withdrawAmount(fromAccount, amount); depositAmount(toAccount, amount); } catch (Exception e) { e.printStackTrace(); } } @TransactionAttribute(TransactionAttributeType.REQUIRED) public void withdrawAmount(Konto k, Float amount) { k.setSaldo(k.getSaldo() - amount); if (k.getSaldo() < 0) sc.setRollbackOnly(); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 137 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement Annotationen für die Transaktionssteuerung Transaktionssteuerung - auf Bean-Ebene Annotation @TransactionManagement ► C Parameter Beschreibung TransactionManagementType Transaktionsmanagement Konstante Default CONTAINER BEAN CONTAINER - auf Methoden-Ebene Annotation @TransactionAttribute ► M Parameter Beschreibung Beschreibung TransactionAttribute TransactionAttributeType AttributeType Transaktionsattribut Konstante Default REQIRED REQUIRES_NEW MANDATORY REQUIRED SUPPORTS NOT_SUPPORTED NEVER - Transaktions-Attribute - Required - die Bean soll immer in einer Transaktion laufen - RequiresNew - es wird immer eine neue Transaktion gestartet - Supports - die Methode wird zur Transaktion des Aufrufers einbezogen - Mandatory - diese Bean-Methode gehört immer zur Transaktion des aufrufenden Clients - NotSupported - diese Methoden können keine Transaktionen unterstützen oder erzeugen - Never - die Methode darf nicht in eine Transaktion einbezogen werden - nicht alle Transaktions-Attribute lassen sich mit allen Beans nutzen - Tabelle zeigt Kombinationsmöglichkeiten Transaktions-Attribut SLSB SFSB MDB Required RequiresNew Mandatory Supports NotSupported Never © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 138 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement 16.6 Application Exception - Unterscheidung von Exceptions - System Exception ► unchecked - Ausnahme der technischen Infrastruktur - Applikation Exception ►checked - Ausnahme der Geschäfslogik - checked ►müssen deklariert / gehandelt werden - Subklassen von java.lang.Exception - unchecked ► müssen nicht deklariert / gehandelt werden - Subklassen von java.lang.RuntimeException Applikation Exception führen nicht automatisch zu einem transaktionalen Rollback - ExceptionKlasse muss mit @ApplicationException annotiert werden Annotation @ApplicationException ► C Parameter rollback rollback Beschreibung Typ Default Rollbackverhalten bei einer Exception Boolean false Aufgabe ► negative Saldo durch Rollback verhindern - transfere von einem Konto zu einem anderen Konto - wird der saldo eines Kontos dabei negative ► Rollback (durch Kontainer) @TransactionAttribute(TransactionAttributeType.REQUIRED) public void transferAmount(Konto from, Konto to, Float amount) { this.withdrawAmount(from, amount); this.depositAmount(to, amount); } @TransactionAttribute(TransactionAttributeType.REQUIRED) private void withdrawAmount(Konto k, Float amount) { try { Konto debit = this.getKontoByNr(k.getNr()); debit.setSaldo(debit.getSaldo() - amount); // Entity Manager synchronisiert DB if (debit.getSaldo() < 0) sc.setRollbackOnly(); } catch (Exception e) { throw new EJBException("Could not withdraw Amount"); } finally { closeDatabaseConnection(); } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 139 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement Aufgabe ► Konfiguration By Exception durch ApplicationException - unterschreiten der Kreditgrenze soll verhindert werden @ApplicationException(rollback = true) public class SaldoBelowCreditLimitException extends Exception { public SaldoBelowCreditLimitException (String reason) { System.out.println(reason); } } @TransactionAttribute(TransactionAttributeType.REQUIRED) private void depositAmount(Konto k, Float amount) { try { Konto credit = this.getKontoByNr(k.getNr()); credit.setSaldo(credit.getSaldo() + amount); this.updateKonto(credit); if (credit.getSaldo() < 0) sc.setRollbackOnly(); if (credit.getSaldo() < Konto.saldoLimit) throw new SaldoBelowCreditLimitException("Saldolimite erreicht"); } catch (Exception e) { throw new EJBException("Could not deposit Amount"); } finally { closeDatabaseConnection(); } } Aufgabe ► Kontotransfer als Transaktion - testen Sie das transaktionale Verhalten der EJBs mit einem Kontotransfer - explicit ► BMT Bean Managed Transaction implezit ► CMT Container Managed Transaction ApplicationException Transaktionsverhalten transfereAmount() depositAmount() withdrawAmount() REQUIRED REQUIRED REQUIRED REQUIRED REQUIRES_NEW REQUIRED_NEW SUPPORTS REQUIRED REQUIRED REQUIRED SUPPORTS SUPPORTS NOT_SUPPORTED REQUIRED REQUIRED NOT_SUPPORTED NOT_SUPPORTED NOT_SUPPORTED REQUIRED NEVER NEVER Transaktion © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 140 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionsmanagement O JPA Lerninhalte Begriffe Lebenszyklus Bestandteile Generatorstategien Beziehungen Assoziationen Vererbung Collections Queries Datentypen Transaktionen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 141 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> ORM Object-Relation-Mapping 17 ORM ObjectObject-RelationRelation-Mapping ORM bietet grundsätzlich folgende Vorteile - Produktivität ► Vereinfachung und Objektorientierung des Datenzugriffs - Wartbarkeit ► weniger Codezeilen - Nachvollziehbarkeit ► serverseitiger Cache - Performance ► automatisierte Erstellung der SQL Statements - Unabhängigkeit ► abstrahierter Datenbankzugriff - Darstellung der Entitäten durch POJOs nicht auf den Einsatz unter Java EE begrenzt - Version 2.0 lauffähig unter Java SE / ausserhalb eines EE Containers JBoss AS JPA Java Persistence API – Version 1.0 - Spezifikation für O/R Mapping Version 3.1 JSR 220 EJB3 – Version 3.0 - Spezifikation für Container Komponenten - Spezifik Spezifikation für Managed Persistence JSR 318 Begriffserklärungen JSR 317 17.1 Hibernate - Implementation eines O/R Mapping Framework - Hibernate Core ► Definition mit XML Hibernate Annotation ► Definition per Annotations Hibernate Entity Manager ► Zugriff auf den Persistenzkontext © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 142 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18 JPA - spezifiziert durch JSR 220 / JSR 317 - spezifiziert Persistenz Framework - (Definition) aus Hibernate, TopLink und JDO entstanden - nicht auf den Einsatz unter Java EE begrenzt - lauffähig unter Java SE - als normale Java Anwendungen - ausserhalb eines Java EE Containers - Darstellung der Entitäten durch POJOs (Plain old Java Objects) - Definition der Metadaten durch Annotationen - XML (Deployment) Deskriptor-Dateien zur Angabe der Metadaten als Alternative - orm.xml (Deployment) Deskriptor-Dateien überschreiben Annotationen Ziel ► Java EE zu vereinfachen 18.1 Persistenz Provider - Entity - Java Repräsentation eines persistenten Datensatzes - Entity Class - Default Konstruktor - private Attribute - Getter- und Setter Methoden - Entity Manager - JPA Standard Interface - synchronisiert mit der Datenbank - Persistence Context - Menge aller Entitäten einer Transaktion - First Level Cache - Persistence Unit - Beschreibung von Entity-Klassen - Data-Source - entspechende Abbildungsinformationen - Database Transaction - garantiert ACID Verhalten der Datenbank © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 143 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Persistezprovider JPA Standard synchronisiert mit DB Datenbank Transaktion Entity Manager garantiert ACID der DB lädt / speichert arbeitet auf Entity Objekt RepräsenRepräsentation eines Tupel umfasst Instanz von POJO - serialisierbar - Default Konstruktor - private Attribute - getter / setter 18.1.1 assoziiert mit Menge aller Entitäten einer Transaktion Transaktion FirstFirst-LevelLevel-Cache Persistenz Kontext bezieht sich auf Entity Klasse Persistenz Unit - Entityklassen - Datasource - Abbildungsinfos umfasst Entities - leichtgewichtige, persistente Objekte als POJOs - zentraler Teil der Java Persistence API - abstrakte wie auch konkrete Java-Klassen werden verwendet - Vererbung, polymorphe Assoziationen und polymorphe Abfragen sind unterstützt - nicht von einer bestimmten Basisklasse abgeleitet - eigene Vererbungshierarchie kann verwendet werden - Bedingungen - muss einen parameterlosen Konstruktor enthalten public oder protected - muss eine Top-Level-Klasse sein nicht final - Methoden oder persistente Attribute dürfen nicht final sein - implementiert Serializable falls Instanzen "by-value" übertragen werden sollen - muss einen Primärschlüssel enthalten - Deklaration - mit Annotation @Entity - per XML orm.xml © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 144 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Deklaration einer Entity mit Annotations - Markierung der Klassenattribute - oder Markierung der Getter-Methoden @Entity public class Person implements Serializable { @Id private Long id; private String name; @ManyToMany(targetEntity = Address.class) private Collection<Address> addresses; getter / setter / Konstructor / hashCode / equals / toString @Entity @Table(name="Adresse") public class Address implements Serializable { @Id private Long id; private String street; private String city; getter / setter / Konstructor / hashCode / equals / toString Deklaration einer Entity per orm.xml - Schemadefinitionen Tabellenname, Spaltennamen, etc. Relationen One:One, One:Many, Many:One, Many:Many Vererbungsstrategien Single Table, Table per Class, Joined Ladestrategien Objekte, Attribute Generatorstrategien für den Primarykey Sequence, Table, Hi-Lo Algorithm, etc. <entity-mappings> <entity class="Person"> <attributes> <id name="id"> <generated-value strategy="AUTO" /> </id> <basic name="name" /> <one-to-many name="adresses" target-entity="Address" mapped-by="address"> </one-to-many> </attributes> </entity> </entity-mappings> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 145 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.1.2 Persistenzunit - erzeugt EntityManager Factory - definiert durch persistence.xml - Persistenz Unit ► referenziert durch Logik Fassade ► BankBean - Data Source ► als Container Rescource - Properties ► ORM Mapping spezifisch ► Hibernate <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="persistenceContext/Bank"> <jta-data-source>java:jdbc/bank</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> ... 18.1.3 EntityManager - verwaltet die Entities - ist genau einem Persistenzkontext zugeordnet - als Container-Managed Entity Manager - als Application-Managed Entity Manager ContainerContainer-Managed Entity Manager - innerhalb eines Java EE Containers - erzeugt und schliesst den Entity Managers verwaltet JTA (Java Transaction API) Transaktionen - definiert durch Dependency Injection - z.B. JNDI lookup Java Naming and Directory Interface ApplicationApplication-Managed Entity Manager - wird von der Anwendung selbst verwaltet - aus EntityManagerFactory instanziiert - Transaktionen durch - JTA ► Java Transaction API - lokale Transaktion ► z. B. JDBC Transaktion © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 146 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.1.4 Persistenzkontext - Menge aller Entitäten einer Transaktion - durch UC Use Case definiert - Cache - First Level Cache definiert durch Framework - z.B. Hibernate @Entity @Cache(usage=CacheConcurrencyStrategy.READ_WRITE) public class Konto implements Serializable { ... } - Second Level Cache als fremde APIs JPA 2.0 Cache APIs Second Level Cache provider Cache Provider Read-Only Read-Write Nonstrict R-W Transactional EHCache OSCache ► Opensymphony Opensymphony JBossCache ► JBoss - Gültigkeitsdauer - transaction-scoped - entspricht der Dauer einer Transaktion - nach Abschluss der Transaktion wird der Persistenzkontext geschlossen - extended - ist unabhängig von einer Transaktion - kann mehrere Transaktionen umfassen - der Persistenzkontext muss manuell (Entity Manager) geschlossen werden //emf = EntityManagerFactory ist Application Managed //Neuen EntityManager erstellen EntityManager em = emf.createEntityManager(); em.getTransaction().begin(); //Transaktion starten Person p = em.find(Person.class, new Long(1)); p.setName("Mein_Name"); p.setAddress(new Address("meine_Strasse", "mein_Ort"); em.persist(p); em.getTransaction().commit(); //Ende der Transaktion } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 147 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.2 Lebenszyklus - der Persistence Provider verwaltet die Zustände eines persistenten Objektes transparent - JPA definiert transparentes O/R-Mapping Framework Entities ist ihr eigener Zustand nicht bekannt es ist nicht direkt möglich, eine Entity nach ihrem aktuellen Zustand zu fragen Objektzustände eine Entity definiert vier verschiedene Zustände - New - neue Entity vorübergehend, flüchtig - Removed - gelöschte Relation gelöscht - Managed - synchronisierte Relation persistent, nicht flüchtig - Detached - unsynchronisierte Relation gelöst Entity Lifecycle new() garbage remove() New garbage refresh() find() getReference() getResultList() getSingleResult() persist() merge()** Removed persist() remove() Managed - JPA Objekt Zustandsdiagramm - Zustandsänderung durch persist() refresh() merge() Operationen des Persistenzkontext - Methoden der EntityManager-Instanz - Methoden der Query-Instanz remove() refresh() merge() detach() close()* clear()* lock() merge()** Detached * betrifft alle Instanzen des Persistenzkontext ** erzeugt persistente Instanz, Originalobjekt bleibt erhalten wirft Exception garbage persist() remove() refresh() © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 148 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Entity ► ObjectState ► New - durch <new> erzeugtes Entity-Objekt aus normalem POJO - keine Verbindung zwischen der Entity und Entity Manager - Zustand der Entity nicht persistent abgespeichert - Garbage Collector entsorgt Objekte ohne Referenz - keine Repräsentation der Entity innerhalb der Datenbank - alle Daten der Entity sind flüchtig und gehen verloren ► Garbage Collector - Entities sind transient, nicht Teil einer Transaktion - Rollback nicht anwendbar ► in transaktionalem Kontext - Primärschlüsselfelder sind noch nicht gesetzt - werden durch den Persistenz-Manger erzeugt - persist() ► Übergang von New zu Managed - merge()► Übergang von New zu Managed Entity ► ObjectState ► Managed - Entity wird von dem Entity Manager verwaltet - Entity hat einen Primärschlüssel zugewiesen (auch ohne) Repräsentation innerhalb der Datenbank - persist() veranlasst keine Datenbankaufrufe - Entities im persistenten Zustand sind Teil einer Transaktion - Änderungen können durch Rollback rückgängig gemacht werden - Exception ► Rollback - Änderung von Attributen wird erkannt - setter SQL UPDATE - merge() ► synchronisiert persistente Entity durch den Entity Manager - Return-Wert ist synchronisierte Entity ► mit entsprechender Id - find() ► erzeugt persistente Entity - ohne Übergang von New nach Managed - detach() ► Übergang von Managed zu Detached - remove() ► Übergang von Managed zu Remove © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 149 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Entity ► ObjectState ► Detached - durch schliessen des Entity Managers ► close() - Zuordnung der Entities zum Manager endet Entities sind nicht mehr Teil einer Transaktion Änderungen werden nicht mehr mit Datenbank synchronisiert Java-Objekte enthalten trotzdem (veraltete) persistente Daten - durch Serialisieren (und Übertragen) einer Entity in einen anderen Prozess - Transferieren des POJO in eine Remote-Anwendung Client-Request - als Transfer-Objekte zwischen Präsentationsschicht und Datenbankschicht - merge() ► Übergang von Detached zu Managed - Kopie der Entity wird wieder in Persistenzkontext aufgenommen - lock() ► Übergang von Detached zu Managed - unveränderte Entity wird wieder in Persistenzkontext aufgenommen - Parameter lockMode definiert verschiedene Lock-Modi in Verbindung mit Transaktionen Entity ► ObjectState ► Removed - Entity-Objekt für das Löschen markiert - wird am Ende der laufenden Transaktion gelöscht ► z.B. mit flush() kann wieder in den managed Zustand aufgenommen werden ► persist() - persist() ► Übergang von Removed zu Managed remove() löscht die Daten der Entity innerhalb der Datenbank, JavaJava-Objekt bleibt verfügbar, vorausgesetzt, vorausgesetzt, es wird noch referenziert. referenziert. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 150 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.3 Bestandteile eines O/R Mapping Frameworks Entities - leichtgewichtige, persistente Objekte - lösen die schwergewichtigen Entity Beans ab - zentraler Teil der Java Persistence API - abstrakte wie auch konkrete Java-Klassen werden verwendet - Vererbung, polymorphe Assoziationen und polymorphe Abfragen sind unterstützt - nicht von einer bestimmten Basisklasse abgeleitet - eigene Vererbungshierarchie kann verwendet werden - Entities und Java-Klassen können beliebig kombiniert werden - Entity-Klasse muss mit der Annotation @Entity markiert werden - Entity-Klasse muss einen parameterlosen Konstruktor enthalten (public oder protected) - Entity-Klasse muss eine Top-Level-Klasse sein, darf nicht als final deklariert sein - Methoden oder persistente Attribute der Klasse dürfen nicht final sein - das Interface Serializable muss implementiert werden - falls Instanzen der Klasse "by-value" übertragen werden sollen - jede Entity muss einen Primärschlüssel enthalten Beschreibung durch Annotations - innerhalb der Entity-Klassen - die persistenten Attribute - mit Mapping- und anderen Metadaten - Markierung der Klassenattribute - Markierung der Getter-Methoden Die Markierung persistenter Attribute muss innerhalb einer Klassen KlassenHirarchie identisch sein. Als Typen von persistenten Attributen gelten: - alle primitiven Javatypen und deren Wrapperklassen / java.lang.String serialisierbare Javaklassen (z. B. java.math.BigInteger, java.math.BigDecimal, etc.) selbstdefinierte serialisierbare Javaklassen Enumerations java.util.Collection, java.util.Set, java.util.List, java.util.Map Collections von Entity-Klassen Embeddable Klassen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 151 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.3.1 Primärschlüssel - einfaches Attribut der Klasse ► @Id - alle primitiven Javatypen - java.lang.Long / java.lang.String / java.util.Date / java.sql.Date - java.math.BigInteger / java.math.BigDecimal ► Praxis ? - Primärschlüsselklasse ► @IdClass - die Klasse muss das Serializable Interface implementieren - die Methoden equals und hashcode müssen definiert werden - die Klasse muss public sein und einen parameterlosen Konstruktor enthalten - zusammengesetzter Schlüssel ► @EmbeddedId - Instanzvariable vom Typ der Primärschlüsselklasse wird definiert als Embeddable Klasse - Entity-Klasse enthält einzelne Felder des Primärschlüssels Innerhalb einer Vererbungshierarchie von Entities darf nur ein Primärschlüssel definiert werden. Auss Ausserdem sserdem muss er in der obersten Klasse der Hierarchie deklariert sein. 18.4 Beziehungen zwischen Entities Embeddable Klassen - durch die Annotation @Embeddable markiert ► nicht @Entity - dieselben Bedingungen wie die Entity-Klasse - keinen Primärschlüssel - die persistenten Attribute der embedded Klasse werden auf die gleiche Tabellenzeile wie die der Entity Klasse gemappt embedded Klasse gehöret zur Entity und kann nicht von mehreren Entity Objekten referenziert werden Sekundärtabellen - deklariert Instanzvariable als Value-Typ - bildet Value-Typ in eigene Tabelle ab Relationship - 1 : 1 ► @OneToOne - 1 : n / n : 1 ► @OneToMany / @ManyToOne - n : m ► @ManyToMany © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 152 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA uni uni-direktionale direktionale Beziehungen - vom Anwenderfall definiert ► UCs - einfachere Strategie bibi-direktionale Beziehungen - unterscheiden zwischen "Besitzer" und der referenzierten Seite - Besitzer durch Userverhalten (UC) definiert referenzierte Seite muss auf ihren Besitzer durch mappedBy verweisen @Entity public class Person implements Serializable { @Id private Long id; ... @ManyToOne private Address address; ... @Entity @Table(name = "Adresse") public class Address implements Serializable { @Id private Long id; ... @OneToMany(mappedBy = "address") private Collection<Person> persons; 18.4.1 Vererbung - Polymorphe Assoziationen - als Beziehungen auf verschiedene konkrete Klassen innerhalb einer Vererbungshierarchie - Polymorphe Abfragen - liefern verschiedene konkrete Klassen einer Vererbungshierarchie zurück - können sich auf abstrakte Entities beziehen - liefern immer Instanzen von konkreten Subklassen als Ergebnis - abstrakte Klassen - können mit @Entity definiert werden - können nicht direkt instanziiert werden - MappedSuperclass - deklariert Superklasse einer Entity - wird nicht direkt einer Tabelle zugeordnet - Attribute werden auf die Tabellen der abgeleiteten Entity-Klassen gemappt - kann nicht direkt mittels einer Abfrage gesucht werden - Verwendung in einer Entity-Relationship ist nicht direkt möglich © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 153 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Vererbungsstategien - SINGLE_TABLE - eine Tabelle für die ganze Hierarchie - Diskriminator Spalte - Polymorphe Abfragen sind möglich - TABLE_PER_CLASS - Eine Tabelle pro konkreter Entity-Klasse - Unterstützung durch Implementierung optional - jede Tabelle enthält ALLE Attribute - inklusive der geerbten - keine polymorphen Abfragen möglich SQL UNION als Behelf - JOINED - eine Tabelle je Superklasse und je abgeleitete Entity-Klasse - eine Tabelle je Klasse einer Vererbungshierarchie - jede Tabelle enthält spezifische Attribute der jeweiligen Klasse - polymorphe Abfragen sind möglich (nicht sehr performant) 18.5 Persistenzkontext - erzeugt EntityManager Factory - definiert durch persistence.xml - durch Dependency Injection - in der Fassade ► BankBean 18.6 EntityManager - verwaltet die Entities - stellt die API für den Zugriff auf einen Persistenzkontext bereit - einem Entity Manager ist immer genau ein Persistenzkontext zugeordnet - Container-Managed Entity Manager - Application-Managed Entity Manager Persistenzkontext bezeichnet bezeichnet Menge von EntityEntity-Objekten die innerhalb der Datenbank höchstens ein JavaJava-Objekt im Kontext repräsentieren. repräsentieren. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 154 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA EntityMana EntityManager definiert: definiert: - Entity-Lifecycle - auch durch EM Lifecycle - Praxis ► Transaktion - Praxis ► Use-Case - Queries - NamedQueries - wiederverwendbar - NativeQueries - ANSI SQL - CriteriaQuerie - OO Ansatz - Finderfunktionalitäten - wenn PK bekannt - Ladestategien - transaktionales Verhalten - feingranular - sperren ► lock - erweitern ►join ContainerContainer-Managed Managed Entity Manager ►@PersistenceContext - kommen innerhalb eines Java EE Containers zum Einsatz - Container ist für das Erzeugen und Schliessen des Entity Managers verantwortlich - der Java EE Container verwaltet JTA Java Transaction API - Verwaltung geschieht transparent für die Anwendung - Zugriff auf den Entity Manager erhält die Anwendung durch - Dependency Injection - JNDI ApplicationApplication-Managed Entity Manager - Entity Manager wird von der Anwendung verwaltet - zum Erzeugen wird eine EntityManagerFactory verwendet - Transaktionen durch - JTA Java Transaction API - lokale Transaktion ► z.B. JDBC Transaktion © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 155 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Gültigkeitsdauer eines Persistenzkontexts - transaction-scoped - entspricht der Dauer einer Transaktion Transaktion definiert den PersistenceContext - der Persistenzkontext wird geleert - die Entities detached und numanaged - extended - ist unabhängig von einer Transaktion - aber nur innerhalb der JVM gültig ► Applikationserver - kann mehrere Transaktionen umfassen - Persistencekontext bleibt erhalten - Entities werden automatisch synchronisiert - persist() oder merge() ist nicht notwendig - Persistenzkontext wird manuell verwaltet - durch Schliessen des Entity Manager Methoden Methoden der EntityManager API (Ausschnitt) public void persist(Object entity); - Übergang zu managed Entity Instanz ► commit() / flush() persistiert Objekt - ist entity eine neue Entity wird diese zur managed Entity - ist entity eine bestehende managed Entity so wird nichts geschehen - ist entity eine removed Entity wird diese zur managed Entity - ist entity eine detached Entity wird eine IllegalArgumentException geworfen - gilt auch für relationale Felder von entity die mit CascadeType.PERSIST annotiert sind public void remove(Object entity); - Übergang zu removed Entity Instanz ► commit() / flush() löscht Objekt - ist entity eine neue Entity so wird nichts geschehen - ist entity eine bestehende managed Entity so wird diese gelöscht - ist entity eine removed Entity so wird nichts geschehen - ist entity eine detached Entity wird eine IllegalArgumentException geworfen - gilt auch für relationale Felder von entity die mit CascadeType.REMOVE annotiert sind © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 156 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA public void refresh(Object entity); - synchronisiert die Entity Instanz mit der Datensource ► überschriebt Entity - ist entity eine neue Entity wird eine IllegalArgumentException geworfen - ist entity eine bestehende managed Entity so wird diese mit der Datensource synchronisiert - ist entity eine removed Entity wird eine IllegalArgumentException geworfen - ist entity eine detached Entity wird eine IllegalArgumentException geworfen - gilt auch für relationale Felder von entity die mit CascadeType.REFRESH annotiert sind public <T> T merge(Object entity); - Übergang von einer detached Entity zu einer managed Entity Instanz - ist entity eine detached Entity so wird diese in die existierende managed Instanz von entity kopiert - oder eine neue Kopie einer managed entity Instanz erstellt ist entity eine neue Entity so wird eine neue managed Instanz entity* als Kopie erstellt ist entity eine bestehende managed Entity so wird nichts geschehen ist entity eine removed Entity wird eine IllegalArgumentException geworfen gilt auch für relationale Felder von entity die mit CascadeType.MERGE annotiert sind public void detach(Object entity); - Übergang zu einer detached Entity Instanz - ist entity eine bestehende managed Entity so wird diese zu einer detached Entity - ist entity eine detached Entity so wird nichts geschehen - gilt auch für relationale Felder von entity die mit CascadeType.DETACH annotiert sind public void lock(Object entity, LockModeType mode); - Sperrt die Entity Instanz - LockModeType.READ - andere Transaktionen können das Objekt lesen aber nicht ändern - LockModeType.WRITE - andere Transaktionen können das Objekt weder lesen noch schreiben © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 157 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA public <T> T find(Class<T> entity, Object primaryKey); - Sucht ein Objekt - lädt die entity aus der Datenbank, welche dem Primärschlüssel zugeordnet ist - liefert null, falls keine Entity gefunden wurde public <T> T getReference(Class<T> entity, Object primaryKey); - lädt ein Proxy (bzw. eine Referenz) einer Entity - durch den angegebenen Primärschlüssel eindeutig identifiziert - übrige Felder der Entity können zu einem späteren Zeitpunkt nachgeladen werden - Vorgehen ist sinnvoll, wenn eine Entity einer anderen zugeordnet werden soll und der eigentliche Inhalt gar nicht benötigt wird public boolean contains(Object entity); - prüft ob sich die Entity im Persistenzkontext des Entity Managers befindet public void flush(); - synchronisiert die Datensource mit den Entity Objekten - weist den EntityManager an, den Zustand aller Entites die dem Persistenzkontext zugeordnet sind, - mit der Datenbank zu synchronisieren Synchronisation geschieht dabei nur in eine Richtung; der Inhalt der Entity-Objekte im Persistenzkontext wird nicht aktualisiert, falls sich der Inhalt der entsprechenden Datenbankfelder geändert haben sollte. Synchronisation wird nur ausgeführt, wenn eine Transaktion aktiv ist public void clear(); - leert den Persistenzkontext des Entity Managers - Persistenzkontext des Entity Managers wird geleert - alle verwalteten Entities werden detached Entities - Synchronisation mit der Datenbank findet nicht statt © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 158 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA Exception des EntityManagers IllegalArgument IllegalArgumentArgument- Objekt ist keine Entity OptimisticLock OptimisticLockLockRollbackRollbackTransactionTransactionRequiredRequired- DB Inhalt wurde geändert Rollback kann nicht durchgeführt werden keine laufende Transaktion joinTransction Entity existiert nicht (mehr) contains EntityNotFound EntityNotFoundFound- lock PK existiert bereits refresh EntityExistsEntityExists- flush setzt Transaktionsstatus auf RollbackOnly getReference PersistencePersistence- find Beschreibung remo remove ve -Exception EntityMangers Methoden merge Exception des EntityManagers persist 18.6.1 NoResultQuery.getSingleResult() liefert kein NoResultNoUniqueResult NoUniqueResultResult- oder mehr als ein Ergebnis, kein Rollback 18.7 Entity Listener - informiert über Ereignisse während des Lebenszyklus einer Entity - als Container Callback Methode - als Listener Klasse 18.7.1 Listener als Container Callback - Interception durch Container - als Lifecycle Ereignis - erweitert Persistenzmechanismus durch eigene Funktionalitäten Container Callback als EnitiyListener Annotation Beschreibung @PrePersist / @PreRemove @Post @PostPersist ostPersist / @Post @PostRemove ostRemove @PreLoad / @PreUpdate @PreUpdate @PostLoad @PostLoad / @PostUpdate @PostUpdate vor der Ausführung von EntityManger.persist() / remove() nach der Ausführung von EntityManger.persist() / remove() vor der Ausführung von EntityManger.update() / refresh() nach der Ausführung von EntityManger.load() / update() © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 159 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.7.2 Listener als Entity-Listener-Klasse - durch @EntityListeners auf Klassenebene - Methoden werden automatisch aufgerufen - mehrere Methoden mit verschiedenen Callback Annotations können markiert werden - mehrfache Markierung einer Methode durch verschiedene Callback Annotations ist zulässig - jedoch nur eine Methode pro Ereignis - - mehrere Listener pro Entity können definiert werden - Reihenfolge abhängig von der @EntityListener Annotation - Entity Listener und Callback Methoden gemeinsam möglich - Methoden der Entity Listener werden vor den Callback-Methoden aufgerufen Callback-Methode muss die folgende Signatur haben - o ist die Entity, auf die sich die Entity-Listener-Klasse bezieht void <METHODENNAME>() void <METHODENNAME> (<KLASSE> o) Verwendung Verwendung von CallbackCallback-Methoden und Entity Listenern @Entity @EntityListeners(value = { PersonListener1.class, PersonListener2.class }) public class Person implements Serializable { @PostPersist protected void postPersistPerson() { System.out.println("PostPersist Person called"); } public class PersonListener1 { @PrePersist @PostPersist protected void postPersistMethod1(Person p) { System.out.println("PrePersist/PostPersist PersonListener1 called"); } } [STDOUT] PrePersist/PostPersist PersonListener1 called [STDOUT] PrePersist/PostPersist PersonListener1 called [STDOUT] PostPersist PersonListener2 called [STDOUT] PostPersist Person called public class PersonListener2 { @PostPersist protected void postPersistMethod1(Person p) { System.out.println("PostPersist PersonListener2 called"); } } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 160 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA 18.8 Queries - als SQL lesbar - durch JPA Query Language definiert ►polymorph - Massen-Updates und –Deletes - Joins - Group By - Subqueries - JPA QL ist portable ► Datenbank Unabhängigkeit - Native SQL ist proprietär - mehrere Create Methoden stehen zur Verfügung - Query - polimorphe JPA Query ► liefert Entity Objekte - NativeQuery - native SQL Query ► liefert Tabelleninhalte - NamedQuery - wiederverwendbar, parametrisierbar ► durch die Entity definiert Beispiel ► NamedQuery - definiert durch die Entity @Entity @NamedQueries({ @NamedQuery(name = "Person.findAll", query = "from Person p"), @NamedQuery(name = "Person.findByName", query = "from Person p where p.name = :name") }) public class Person implements Serializable { ... } - implementiert und parametrisiert durch die Fassade @Stateless public class BankBean implements Bank { @PersistenceContext(unitName = "persistenceContext/Bank" ) private EntityManager manager; public void deletePerson(Person p){ Person personToDelete = (Person) manager.createNamedQuery("Person.findByName") .setParameter("name", p.getName()).getSingleResult(); manager.remove(personToDelete); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 161 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> JPA ResultSetMapping - benutzerdefinierte Klasse als Resultset ► native - für komplexe Abfragen für definierte Resultatlisten public PersonWithMultipleAccounts getPersonWithMultipleAccounts() { String query = "SELECT p.name, k.name FROM Person p, Konto k WHERE p.kontos.size > 2"; Query q = manager.createNativeQuery(query, "PersonWithMultipleAccounts"); return (PersonWithMultipleAccounts) q.getResultList(); } - definiert eigene ResultSetKlasse ► durch die Entity definiert @SqlResultSetMapping(name = "PersonWithMultipleAccounts", entities = { @EntityResult(entityClass = entity.Person.class, fields = { @FieldResult(name = "name", column = "name") }), @EntityResult(entityClass = entity.Konto.class, fields = { @FieldResult(name = "name", column = "name") }) }) public class Person implements Serializable { .. } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 162 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hibernate 19 Hibernate - Open-Source-Persistenz- und ORM-Framework für Java www.hibernate.org - speichert POJOs mit Attributen und Methoden in relationalen Datenbanken - synchronisiert DB Relationen mit Objekten Vorteile Vorteile - Abstraktion der verwendeten DB - dadurch DB Unabhängigkeit - nicht intrusiv - keine Ableitung eigener Klassen von Hibernate-Klassen erforderlich - keine Voraussetzungen an die Laufzeitumgebung - verwendbar managed und non-managed - Generierung von sehr effizientem SQL Nachteil - exponentieller Komplexitätsgrad 19.1 Hibernate als Persistenzframework - implementiert die standardisierten Annotations ► somit JPA kompatible - deklariert Bedingungen durch Validators - stellt mit dem EntityManager eine Persistenzengine zur Verfügung 19.2 Hibernate Annotations - Verwendung der Hibernate eigenen Annotations ► Erweiterung der Funktionalität - Metadaten im XML-Format ►hbm.xml, resp. orm.xml bei JPA - Lade- / Speicherverhalten - Kaskadierung - Validierung - Geratorstategien für den PrimaryKey Hibernate Annotations erweitern die Persistenzfunktionalität im Umgang mit Polymorphie, Polymorphie, Assoziations Assoziations, Collections Collections und Queries. Queries. Hibernate Annotations sind immer eine Einschrä Einschränkung der Portabilität. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 163 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hibernate 19.3 Hibernate Validator - ermöglicht Deklaration von Bedingungen - die eine gültige Entity erfüllen muss - definiert Constraints - werden als Annotations direkt in der betroffenen Entity deklariert - Methoden wie auch Instanzvariablen können markiert werden - werden durch die Entity-Objekte überprüft ► z.B. durch Entity Listeners - Validator Implementierung führt die tatsächliche Überprüfung durch - Deklaration zentral ► durch die Entity - Überprüfung innerhalb einer mehrschichtigen Anwendung Hinernate Validatoren ►Ausschnitt Annotation Beschreibung Überprüfung von Stringlängen @Lenght Min-, Maximalwert für numerische Werte @Min / @Max überprüfung auf NULL @NotNull überprüft, ob ein Datum in der Vergangenheit / Zukunft liegt @Past / @Future überprüft, ob ein Attribut einem regulären Ausdruck entspricht @Pattern Wertebereich für numerische Werte @Range überprüfung der Länge von Collections, Arrays und Maps @Size überprüft boolean Werte auf false @AssertFalse überprüft boolean Werte auf true @AssertTrue führt eine Überprüfung des markierten Objekts durch @Valid überprüft Kreditkartennummern auf true @CreditCardNumber überprüft EAN-Nummern auf true @EAN überprüft Emails auf true @Email überprüft auf Digits @Digits © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 164 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hibernate Beispiel ►Validierung einer Instanzvariablen import org.hibernate.validator.Length; import org.hibernate.validator.NotNull; @Entity public class Person implements Serializable { @Length(max=10) @NotNull private String name; Beispiel ► Definition von HibernateConstraints HibernateConstraints public void createPerson(Person p) { ClassValidator personValidator = new ClassValidator(Person.class); InvalidValue[] invalidValues = personValidator.getInvalidValues(p); for (InvalidValue iv : invalidValues) System.out.println(iv.getBean() + iv.getMessage()); manager.persist(p); } Output [STDOUT] Person(id=null, name=TESTPerson1, address=Address(id=null, street=Strasse1, city=Ort1, persons=null), kontos=null) muss zwischen 0 und 10 lang sein 19.4 Hibernate EntityManager - implementiert durch die Java Persistence API - Einsatz innerhalb eines Java EE Containers - Einsatz als Standalone Lösung ausserhalb eines Containers - Hibernate EntityManager - setzt auf dem Hibernate Core auf - verwendet diesen als Persistenzengine © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 165 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Hibernate 19.5 Hibernate Tools SQL - Unterstützung bei der Entwicklung - Eclipse Integration - DDL Schema Generation ►hbm2ddl - von einer Hibernate Mapping-Datei - Java Source Generation ► hbm2java - von einer Hibernate Mapping-Datei - Middlegen - Generierung einer Hibernate Mapping Datei Kategorie Beschreibung Anwendung Data Definition CREATE DDL Language DROP DML Data Manipulation Language UPDATE DCL Data Control Language GRANT REVOKE DRL Data Retrival Language SELECT - Third Party Tool © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 166 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kontoverwaltung als Anwendungsbeispiel 20 Kontoverwaltung als Anwendungsbeispiel - einfache Kontoverwaltung - Person als Kontoinhaber - Trustee als Kontoverwalter - Address - für Person - für Trustee - Account als Konto - Personal - Deposit - Euro - Anwendungsfälle - Hinzufügen - Inhaber - Verwalter - Konto - 20.1 Verwaltungsfunktionen Suchfunktionen Konfiguration persistence.xml - definiert eine oder mehrere PersitenceUnits - JEE ► im Verzeichnis META-INF JSE ► im Verzeichis WEB-INF/classes <?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd" version="2.0"> <persistence-unit name="persistenceCotext/Bank"> <jta-data-source>java:jdbc/bank</jta-data-source> <properties> <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <property name="hibernate.show_sql" value="true" /> <property name="hibernate.format_sql" value="true" /> </properties> </persistence-unit> </persistence> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 167 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kontoverwaltung als Anwendungsbeispiel POJO als Entity - einfaches POJO Plain Old Java Object - Annotations der Java Persistence API - @Entity vor der Klassendefinition - Getter- und Setter-Methoden - Java Nameskonventionen - id als eindeutigen Bezeichner für persistente Klasse ► Praxis: Long - durch @Id annotiert - Standardkonstruktor ► auch private möglich @Transient für nicht persistente Felder Annotation @Entity ► C Parameter Beschreibung Name der Entity name Typ Default String Klassenname @Entity(name="Person") public class Person implements Serializable { Tabelle Annotation @Table ► C Parameter Beschreibung Tabellenname name Typ Default String schema Tabellenschema String catalog Tabellenkatalog String Klassenname datenbankspezifisches Schema datenbankspezifischer Katalog uniqueConstraint Unique-Constraints, die auf der Tabelle definiert werden sollen UniqueConstraint[] - Verwendung - anpassen an Legacy @Entity @Table(name = "Adresse") public class Address implements Serializable { © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 168 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kontoverwaltung als Anwendungsbeispiel Fassade wiki Fassade (engl. facade facade) de) ist ein Entwurfsmuster aus dem Bereich der Softwareentwicklung und gehört zu der Kategorie der Strukturmuster (Structural (Structural Patterns). Patterns). Es bietet eine einheitliche und meist vereinfachte Schnittstelle zu einer Menge von Schnittstellen eines Subsystems. Subsystems. - die Entities sind nicht remote ansprechbar - haben keine Schnittstellen - werden über eine Fassade angesprochen - SLSB / SFSB - durch EntityManger ► legt Abhängigkeit zu einer EntityManagerFactory / PersistenzUnit fest Referenzen auf den EntityManager Annotation @PersitenceContext ► C M F Parameter Beschreibung Typ Name der EntityManagerFactory String name String unitName Name der PersistenzUnit type Art des Kontextes properties eine Liste von Eigenschaften PersistenceContextType - TRANSACTION - EXTENDET PersistenceProperies[] Default TRANSACTION herstellungsabhängige Eigenschaften für eine Referenz auf den PersistenceContext Annotation @PersitenceProperty ► C M F Parameter Beschreibung Typ Default Name der Eigenschaft String name Wert der Eigenschaft String value Liste von PersistenceContext Annotationen Annotation @PersitenceContexts ► C Parameter Beschreibung Typ Liste von PersistenceContext PersistenceContext[] value Default Beispiel @PersistenceContexts({ @PersistenceContext(name = "persistence/creditBank", unitName = "creditBank"), @PersistenceContext(name = "persistence/debitBank", unitName = "debitBank") }) @Stateless public class BankBean implements Bank { © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 169 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kontoverwaltung als Anwendungsbeispiel Abhängigkeit zu einer EntityManagerFactory Annotation @PersitenceUnit ► C M F Parameter Beschreibung Typ Name der EntityManagerFactory String name String unitName Name der persistenten Einheit Liste von PersistenceUnit Annotationen Annotation @PersitenceUnits ► C Parameter Beschreibung Typ Liste von PersistenceUnits PersistenceUnit[] value Default Default Beispiel @PersistenceUnit private EntityManager manager; @PersistenceContext(unitName = "persistenceContext/Bank") private EntityManager manager; Aufgabe ►Entities verwalten - erstellen und testen Sie Funktionalitäten der Bank Fassade - Entities erstellen und löschen public void createPerson(Person p) { manager.persist(p); } public void createAccount(Konto k) { manager.persist(k); } public void deletePerson(Person p) { Person personToDelete = (Person) manager .createNamedQuery("Person.findByName") .setParameter("name", p.getName()).getSingleResult(); manager.remove(personToDelete); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 170 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kontoverwaltung als Anwendungsbeispiel 20.2 Application scoped EntityManager - JPA kann ausserhalb eines JEE Umfeld (Applikationsserver) verwendet werden - SE Anwendung - als Session-Per-Request oder Session-Per-Conversation - Spring Anwendung ► http://www.springsource.com - der EntityManager muss dabei selbst verwaltet werden 20.2.1 Entity Manager selber verwalten - aus EntityMangerFactors instanziiert - einer Fassade injected // SetUp from persistence.xml EntityManagerFactory emf = Persistence.createEntityManagerFactory("BankJPA"); em = emf.createEntityManager(); JPABankRepository jpaBR = new JPABankRepository(); jpaBR.setEntityManager(em); em.getTransaction().begin(); ... 20.2.2 Session-Per-Request Idee ► jeder Client Request definiert ein Persistenzkontext Ansatz EntityManager em = JpaUtil.getEntityManagerFactory().createEntityManager(); EntityTransaction tx = null; try { tx = em.getTransaction(); tx.begin(); ... tx.commit(); } catch (Exception e) { if (tx != null) tx.rollback(); throw e; } finally { em.close(); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 171 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kontoverwaltung als Anwendungsbeispiel 20.2.3 Session-Per-Conversation Idee ► Persistenzkontext überlebt mehrere Client Requests Ansatz EntityManager em = JpaUtil.getEntityManagerFactory().createEntityManager(); EntityTransaction tx = null; try { tx = em.getTransaction(); // 1. Transaction tx.begin(); // starten Person p = em.find(Person.class, new Long(1L)); // Entity laden tx.commit(); // 1. Transaktion wird beendet tx = null; p.setName("new Name"); // Entity wird verändert tx = em.getTransaction(); // 2. Transaktion tx.begin(); // starten em.lock(p, LockModeType.READ); // bindet die Entity an den EM em.flush(); // EM synchronisiert Entity tx.commit(); // 2. Transaktion wird beendet tx = null; em.close(); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 172 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Primarykey vs Businesskey 21 Primarykey vs Businesskey Anforderungen an Primärschlüssel - darf nicht null sein - kann nie verändert werden ► nicht sinvoll für einen natürlichen Schlüssel - ist in einer Tabelle über alle Einträge eindeutig Datenbankidentität, Objektidentität, Objektidentität, Objektgleichheit - Objektidentität in Java ► Referenz-Semantic mit == - zwei Objekte sind identisch, wenn sie dieselbe Adresse im Speicher der Java VM haben - Objektgleichheit in Java ► Value-Semantic mit equals - zwei Objekte sind gleich, wenn sie denselben Inhalt haben @Test public void referenceAndValueSemantic() { Person p = new Person("TestPerson", null); bank.createPerson(p); Person newPerson = bank.getPerson("TestPerson"); assertFalse (p.getName() == newPerson.getName()); // zwei Objekte assertFalse(p.equals(newPerson)); // anderer Inhalt } Prax Praxis - equals() und hashcode() immer überschreiben - equals() soll geschäftsrelevante, eindeutige Daten vergleichen hashcode() soll gute Verteilung definieren ► mehr, aber echte Daten - Problematisch bei - Objekte in Collections (Sets, Maps, etc.) - da Implementation durch java.util.HashSet - einbinden von Detached Objekten - bestehendes Objekt wird durch Entity Manger verwaltet ► PKs werden generiert Beispiel ► an einer einer Adressen wohnen zwei Personen - Adresse wird mit einer Collection von zwei Personen erstellt - Objektgleichheit über Primärschlüssel bestimmt, überschreibt das erste Objekt beim Hinzufügen Address a = new Address("Strasse", "Ort"); Collection<Person> persons = new ArrayList(); persons.add(new Person("Person3", a)); persons.add(new Person("Person3", a)); bank.createAddress(a); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 173 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Generatorstrategien 22 Generatorstrategien - persistente Datenbankobjekte haben eine Identität ► PK - @Id definiert Primary Key Attribut - @GeneratedValue definiert Strategie zur Generierung des Primärschlüssels - zwei gleiche Objekte besitzen denselben Primärschlüssel - Verwalten der Primärschlüssel übernimmt Persistenz-Unit Praxisansatz PrimaryKey generieren ► in der Praxis sinnvoll - man muss sich nicht um PK kümmern ► oder FK - der Businesskey kann sich ändern ► z.B. AHV Nummer - der PK darf sich nicht ändern - Daten verlieren ihre Konsistenz - man arbeitet mit konkreten Daten ► Namen, Orte, etc. - PK ist oft ein Literal oder ein numerischer Ausdruck - oder eine Kombination beider 22.1 Generierung des Primary Key Annotation @GeneratedValue ► T Parameter Beschreibung strategy Strategie zum definieren des Primary Keys generator Name des Primärschlüsselgenerators Parameter AUTO IDENTITY SEQUENCE TABLE String Default AUTO verwendet die Strategy der Datenbank @Id @GeneratedValue private Long id; @Test public void createPerson() { Person p = new Person(); p.setName("Name"); bank.createPerson(p); bank.createPerson(p); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 174 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Generatorstrategien Generatoren für die Primärschlüssel Strategie Beschreibung AUTO TABLE wählt entsprechend der darunterliegenden Datenbank eine Strategie (TABLE, IDENTIY, SEQUENCE). Entspricht der Hibernate-Generatorstrategie native. IDs sind in einer eigenen Tabelle. Entspricht der Hibernate-Generatorstrategie hilo ► Hi/Lo Algorithmus unterstützt Identity Columns, die es beispielsweise in MySQL, HSQLDB, DB2 und MS IDENTITY SQL Server gibt. Entspricht der Hibernate-Generatorstrategie identity. SEQUENCE ENCE unterstützt Sequences, die es beispielsweise in PostgreSQL, Oracle und Firebird gibt. SEQU Entspricht der Hibernate-Generatorstrategie sequence. @Id @GeneratedValue (strategy=GenerationType.AUTO) private Long id; Annotation @SequenceGenerator ► T Parameter Beschreibung Typ name sequenceName initalValue allocationSize eindeutiger Name innerhalb der Persistence-Unit kann von anderen Entities referenziert werden Datenbank abhängiges SequenzObjekt Anfangswert für die Generierung Schrittweite Default String String int int abhängig vom Persistence-Provider 0 oder 1 50 @Id @GeneratedValue(generator = "useridgen") @GenericGenerator(name = "useridgen", strategy = "seqhilo", parameters = { @Parameter(name = "max_lo", value = "5"), @Parameter(name = "sequence", value = "mysequence") }) private Long id; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 175 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Generatorstrategien Annotation @TableGenerator ► T Parameter Beschreibung Typ name eindeutiger Name innerhalb der Persistence-Unit String table Tabellenname schema Tabellenschema catalog Tabellenkatalog pkColumnName Spalte für den Namen der Generatoren valueColumn valueColumnName umnName Spalte für den Zählerstand des PK pkColumnValue Generatorname initialValue allocationSize uniqueConstraints uniqueConstraints Anfangswert für die Generierung Schrittweite Definition von Constraints 22.2 Default abhängig vom Persistence-Provider datenbankspezifisches String Schema datenbankspezifischer String Katalog abhängig vom String Persistence-Provider abhängig vom String Persistence-Provider abhängig vom String Persistence-Provider int 0 oder 1 int 50 UniqueConstraint[] String Definition des Primary Key - definiert eine Klasse als fachliche Kombination für den Primärschlüssel Annotation @IdClass ► E Parameter Beschreibung Typ value Class das Klassenobjekt der Primärschlüsselklasse Default @Entity(name="Person") @IdClass(PersonPK.class) public class Person implements Serializable { @Id private Long p_id; @Id private String p_context; - definiert eine eingebettete Klasse als zusammengesetzten Primärschlüssel Annotation @EmbeddedId ► M, F Parameter Beschreibung Typ Default © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 176 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Beziehungen 23 Beziehungen - Beziehungen zwischen Klassen – Relation zwischen Tabellen - Abbilden eines Objektmodells (Vererbung) durch Relationen in einem Datenmodel - Java Objekte werden in Relationen abgebildet - als Komponente - durch Assoziationen - uni-direktional - bi-direktional ► @mappedBy gibt führendes Ende an - N Seite als Collection - java.lang.List ► Reihenfolge der Elemente nicht gegeben ► @OrderBy - java.lang.Set - java.lang.Map - org.hibernate.mapping.Bag Collections Eigenschaft duplikatfrei indexiert inverse performates Update performates performates Inverse 23.1 List Set Map Bag Entity vs Value Komponenten EntityEntity-Komponente - haben einen Primärschlüssel - haben einen Lebenszyklus Valuealue-Komponente - haben keine Datenbankidentität - haben keinen Primärschlüssel - gehören zu einer Entity und ihr Zustand wird innerhalb der Tabelle der dazugehörigen Entity gesichert - typisch sind einfache Objekte vom Typ String - Lebensdauer eines Value-Typ ist immer an den Lebenszyklus der enstpr. Entity gebunden Komponenten ermöglichen die Abbildung mehrerer Klassen auf eine Tabelle. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 177 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Beziehungen Komposition vs. Aggregation wiki Die Komposition (composite (composite aggregation oder composition) composition) als als Sonderfall der Aggregation beschreibt die Beziehung zwischen einem Ganzen und seinen Teilen. Teilen. Der Unterschied zur Aggregation ist im Kern, dass die Existenz des TeilTeil-Objektes durch die des übergeordneten Objektes bedingt ist. Ein Teil kann immer nur genau genau einem Ganzen zugeordnet sein. So kann z. B. ein Raum immer nur zu genau einem Gebäude gehören, nie zu keinem oder mehreren. - Komposition ► starke Bindung - ausgefüllte Raute - Aggregation ► schwache Bindung - nicht ausgefüllte Raute Die Komposition verstärkt gegenüber der Aggregation die Bindung einer Assoziation. Assoziation. 23.2 Value Komponenten Aggregation ► schwache Bindung - Objekt ist ein Teil eines anderen Objekts - Adresse kann auch ohne Person und alleine existieren - mit oder ohne Bezug zur Person ► Attribut Address.person ► ev. @NotNull Komposition ► strenge Bindung - die Lebensdauer des Objektes Address ist an das Objekt Person gebunden - eine Address wird immer mit oder nach dem Person erzeugt - und mit dem Objekt Person zerstört Die Implementierung mit Java macht keinen Unterschied. Aber Address ist für Persistenzprovider ein ValueValue-Komponente, Komponente, hat also keinen Primärschlüssel. Komposition wird in UML mit einer gefüllten Raute dargestellt ► http://www.omg.org © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 178 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Beziehungen 23.2.1 Embeddable - Annotation @Embeddable definiert Komponente auf Klassenebene - ohne @Id - Entity Person mit dem Attribut address muss nicht gekennzeichnet werden - @Embedded ist optional Aufgabe ►Embe Embedded Klasse - testen Sie die Adresse als Value-Komponente @Entity public class Person implements Serializable { @Embedded // optional private Address address; @Embeddable public class Address implements Serializable { ... } 23.2.2 Sekundärtabellen - @SecondaryTable deklariert Instanzvariable als Value-Typ - @SecondaryTable definiert die Tabelle der Value-Komponente Annotation @SecondaryTable ► E Parameter name Beschreibung Typ Tabellenname String schema Tabellenschema String catalog Tabellenkatalog String uniqueConstraint pkJoinColumns Annotation Parameter value Default datenbankspezifisches Schema datenbankspezifischer Katalog Unique-Constraints, die auf der UniqueConstraint[] Tabelle definiert werden sollen PKs der Tabellen über die die PrimaryKeyalle PKs der Beziehung hergestellt werden soll CoinColumn[] Primärtabelle @SecondaryTables ► E Beschreibung Liste von SecondaryTables Typ Default SecondaryTable[ ] © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 179 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Beziehungen Column Persistenzprovider definiert als Spaltennamen für Komponenten den Attributnamen - Annotation @Column definiert den Spaltennamen benutzerspezifisch - @Column definiert den Namen der Tabellenspalte Annotation @Column ► T Parameter Beschreibung Typ Default name String Name des Attributs Boolean false Boolean Boolean Boolean String String int int int true true true referenzierte Spalte Primärtabelle 255 herstellerabhängig 0 unique nullable insertable updatable columnDefinition table table length precision scale Spaltenname definiert eindeutiges Schlüsselfeld, kann alternative über uniqueConstraint auf Tabellenebene deklariert werden erlaubt Null-Werte, hat für primitive Java Typen keine Wirkung definiert die Insert-Funktionalität definiert die Update- Funktionalität Fragment der SQL Typendefinition Namen der Tabelle, welche die Spalte enthält Spaltengrösse ► nur für String anwendbar Anzahl Stellen ►nur für numerische Spalten Anzahl Nachkommastellen ► nur numerische Spalten anwendbar Aufgabe ►SecundaryTable - testen Sie die Addresse mit Instanzvariablen als Sekundärtabellen - - email ►persöhnliche Emailadresse - owned ►als Boolscher Wert @Entity @SecondaryTables( { @SecondaryTable(name = "EMAIL"), @SecondaryTable(name = "OWNED") }) public class Address implements Serializable { @Column(name = "personal_email", table = "EMAIL") private String email; @Column(name = "self_owned", table = "OWNED") private boolean owned; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 180 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Beziehungen Aufgabe ► Column - setzen Sie die Attribute der Adresse benutzerspezifisch mit der @Column Anotation - email als unique owned als read-only @Column(name = "personal_email", table = "EMAIL", unique = true) private String email; @Column(name = "self_owned", table = "OWNED", insertable = false) private boolean owned; @Test(expected = EJBException.class) public void testReadOnlyOwnedUniqueEmail () { Address a = new Address("Strasse", "Ort", "[email protected]", true); bank.createAddress(a); bank.createAddress(a); } ERROR [org.hibernate.util.JDBCExceptionReporter] Duplicate entry '[email protected]' for key 'personal_email' AttributeOverride - überschreibt die Definition eines Feldes in der Superklasse - ermöglicht Wiederverwendung der Komponente Annotation @AttributeOverride ► C F M Parameter Beschreibung Typ Attribut String name Spaltenname @Column column Annotation @AttributeOverrides ► C F M Parameter Beschreibung Typ Liste von AttributeOverride AttributeOverride[] value Default Default Aufgabe ► AttributeOverride @Entity public class Person implements Serializable { @AttributeOverrides( { @AttributeOverride( name = "street", column = @Column(name = "personstreet")), @AttributeOverride( name = "city", column = @Column(name = "personcity", length = 50)) }) private Address address; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 181 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24 Assoziationen - Verbindung mindestens zweier Klassen - erlaubt das Navigieren von der einen zur anderen Klasse - binäre Assoziation ist eine Beziehung zwischen zwei Klassen - reflexive Assoziation definiert Beziehung zu sich selbst - Kardinalität beschreibt den Grad einer Beziehung zwischen zwei Klassen: - Eins-zu-Eins ► 1:1 ► @OneToOne - eine Klasse steht mit einer anderen Klasse in Beziehung - Eins-zu-Viele / Viele-zu-Eins ► 1:n / n:1 ► @OneToMany / @ManyToOne - eine Klasse steht mit mehreren anderen Klassen in Beziehung - Viele-zu-Viele ► n:n ► @ManyToMany - mehrere Klassen stehen mit mehreren anderen Klassen in Beziehung - Bei allen Assoziationen unterscheidet man - unidirektionale Beziehungen - nur über eine Entity kann navigiert werden - bidirektionale Beziehungen - beidseitige Navigation möglich ► Entitys müssen beidseitig Getter und Setter definieren 24.1 Überschreiben von Assoziationen - Analog zum Re-Mapping von Attributen - Re-Mappen von Beziehungen ► überschreiben der FK - @AssociationOverride resp. @AssociatenOverrides Annotation @AssociationOverride ► C F M Parameter Beschreibung Typ p Ty Attribut String name Liste von Spaltenname @JoinColumn[] joinColumns Annotation @AssociationOverrides ► C F M Parameter Beschreibung Typ Menge von AssociationOverride AssociationOverride[] value Default Default @Entity @AssociationOverride( name = "address", joinColumns = @JoinColumn(name="address_fk")) public class Person implements Serializable { ... } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 182 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.2 Überschreiben von Fremdschlüsselbezeichnungen Annotation @JoinColumn ► F M Parameter Beschreibung Spaltenname name definiert eindeutiges Schlüsselfeld, kann auch über uniqueConstraint auf Tabellenebene deklariert werden erlaubt Null-Werte, hat für primitive Typen keine Wirkung nullable definiert die Insert-Funktionalität insertable definiert die Update-Funktionalität updatable columnDefinition Fragment der SQL Typendefinition unique referencedreferencedColumnName Name der Spalte auf die referenziert wird Annotation @JoinColumns ► F M Parameter Beschreibung Menge von JoinColumn Annotations value 24.3 Typ Default String Attribut Boolean false Boolean Boolean Boolean String true true true ref. Spalte String ref. PK Typ Default JoinColumn[] @OneToOne - bei 1:1 Beziehungen haben die beiden Tabellen den gleichen Primary-Key - Primary-Key selbst erzeugen ► nicht Business-Key verwenden - Generatorstrategie verwenden Annotation @OneToOne ► M F Parameter Beschreibung targetEntity Entitätsklasse Angabe der Kaskadierungsoperationen cascade definiert Ladeverhalten des Attribut fetch optional mappedBy erlaubt Null-Werte ► muss nicht Assoziation belegt sein hat für primitive Java Typen keine Wirkung definiert Attribut der führenden Entity bei bidirektionalen Beziehungen Typ Default Class Attributtyp CascadeType[] FetchType EAGER Boolean true String falls keine Kaskadierung für die Beziehung Beziehung definiert wurde ist ein expliziter expliziter Aufruf von persist() notwendig © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 183 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen Aufgabe ► Primärschlüssel der Relation selbst erzeugen - Annotation @OneToOne kennzeichnet Address als 1-zu-1-Beziehung - beide in Beziehung stehende Objekte haben immer denselben Primärschlüssel - Annotation @PrimaryKeyJoinColumn - als Unidirektionale 1-zu-1-Beziehung mit gemeinsamem PK @Enity public class Person implements Serializable { @Id @GeneratedValue private Long id; @OneToOne @PrimaryKeyJoinColumn private Address address; @Enity public class Address implements Serializable { @Id private Long id; @Test public void createPersonWithAddress() { persist(p) erzeugt einen Primärschlüssel für die Person Person p = new Person(); p.setName("Name"); id für die Entity Address muss selbst gesetzt werden bank.createPerson(p); bank.createAddress(new Address(bank.getPerson(p.getName()).getId(),"Strasse", "Ort")); assertEquals("Strasse", bank.getPerson(p.getName()).getAddress().getStreet()); assertEquals("Ort", bank.getPerson(p.getName()).getAddress().getCity()); } Aufgabe ► bibi-direktionale 1:1 Beziehung - Address kann Person referenzieren - Address.person mit @OneToOne annotiert - Attribut mappedBy definiert die führende Entity ► auch die "owing" Seite der Beziehung @Enity public class Person implements Serializable { @Id @GeneratedValue private Long id; @OneToOne @PrimaryKeyJoinColumn private Address address; @Entity public class Address implements Serializable { @Id private Long id; @OneToOne(mappedBy = "address") private Person person; @Test public void bidirektionalePersonAddressBeziehung() { Person p = new Person(); p.setName("Name"); bank.createPerson(p); bank.createAddress(new Address(bank.getPerson(p.getName()).getId(),"Strasse", "Ort")); assertEquals("Name", bank.getAddress("Strasse","Ort").getPerson().getName()); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 184 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.4 @OneToMany - jedes Konto gehört einer Person - sonst existiert es nicht ► Komposition - eine Person hat mehrere Konten - eine Person kann auch kein Konto haben Annotation Parameter targetEntity cascade fetch mappedBy orphanRemoval @OneToMany ► M F Beschreibung Typ Entitätsklasse Angabe der Kaskadierungsoperationen definiert Ladeverhalten des Attributs definiert Attribut der führenden Entity löscht die in Beziehung stehenden Entities mit Class Attributtyp CascadeType[] FetchType LAZY String boolean false Default @OneToMany(cascade = CascadeType.PERSIST, fetch=FetchType.EAGER) private List<Account> accounts; 24.4.1 @OneToMany Parameter - cascade - Weitergeben der Persistenzfunktionalität an den in Beziehung stehenden Entities - fetch - Laden der in Beziehung stehenden Entities cascade Parameter value Beschreibung Beschreibung Typ Default Cascade-Stategie CascadeType[] kein Durchreichen CascadeType Parameter Beschreibung alle Persistenzfunktionen des Entitymangers werden weitergereicht ALL REMOVE reicht Entitymanager.remove an die in Beziehung stehende Entity weiter PERSIST reicht Entitymanager.persist an die in Beziehung stehende Entity weiter REFRESH reicht Entitymanager.refresh an die in Beziehung stehende Entity weiter reicht Entitymanager.merge an die in Beziehung stehende Entity weiter MERGE org.hibernate.annotations.CacadeType org.hibernate.annotations.CacadeType definiert die Cascadierung feingranularer © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 185 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen fetch Parameter value Beschreibung Typ Default Fetch-Stategie FetchType LAZY FetchType Parameter Beschreibung alle in Beziehung stehenden Entities werden sofort vollständig geladen EAGER die in Beziehung stehenden Entities werden erst bei Bedarf (nach-) geladen LAZY - Eager Load ► teuer: ressourcen- und zeitintersiv - Daten einer Entität werden sofort vollständig aus der Datenbank gelesen - in entsprechende Attribute geschrieben - alle referenzierten persistenten Objekte werden rekursiv instanziiert - sofort und vollständig aus der Datenbank geladen - Lazy Load ► sinnvoll bei grossen Datenmengen - Daten einer Entität werden erst aus der Datenbank geladen wenn ein entsprechender Zugriff - darauf erfolgt gilt auch für die referenzierte Objekte LazyLazy-LoadingLoading-Strategie in der Praxis komplex ► unkla unklare nklare Spezifikation Aufgabe ► @OneToMany - testen Sie die 1:N Bezehung - als Aggregation zwischen Person und Konto @OneToMany(cascade = CascadeType.PERSIST, fetch=FetchType.EAGER) private List<Account> accounts; @Test public void createPersonWithAccounts() { Person p = new Person(); p.setName("Name"); Account a1 = new Account("123-0", "Privatkonto", 100.0f , "CHF"); Account a2 = new Account("123-1", "Sparkonto", 200.0f , "CHF"); Account a3 = new Account("123-2", "Lohnkonto", 300.0f , "CHF"); List<Account> accounts = new ArrayList<Account>(); accounts.add(a1); accounts.add(a2); accounts.add(a3); p.setAccounts(accounts); bank.createPerson(p); assertEquals(3, bank.getPerson(p.getName()).getAccounts().size()); } - es wird dabei eine Verbindungstabelle <person_account> erstellt © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 186 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.5 JoinColumn - definiert die Tabellenspalte als Fremdschlüssel der Beziehung Annotation @JoinColumn ► M F Parameter Beschreibung Spaltenname name Typ Default String Attributsname Boolean false Boolean true Boolean true Boolean true updatable definiert eindeutiges Schlüsselfeld kann alternativ über uniqueConstraint auf Tabellenebene deklariert werden erlaubt Null-Werte hat für primitive Java Typen keine Wirkung definiert die Insert-Funktionalität des Persistence Providers für dieses Attribut definiert die Update- Funktionalität des Persistence Providers für dieses Attribut columnDefinition Fragment der SQL Typendefinition String referencedreferencedColumnName Name der Spalte auf die referenziert wird String unique nullable insertable referenzierte Spalte PK der referenzierten Tabelle Aufgabe ► @OneToMany mit JoinColumn - referencedColumnName definiert Name des referenzierten Feldes - testen Sie 1:N Beziehung mit einer JoinColumn testen Sie ohne cascading und mit FetchType=LAZY @OneToMany @JoinColumn(name="p_fk", referencedColumnName="id", nullable=false ) private List<Account> accounts; public void createPerson(Person person) { manager.persist(person); List<Account> accounts = person.getAccounts(); for (Account account : accounts) manager.persist(account); } public Person getPerson(String name) { Person person = (Person)manager.createNamedQuery("... person.getAccounts(); return person; } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 187 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.6 @ManyToOne - gleiche Konstellation - andere Sichtweise ► Account - Person Annotation Parameter targetEntity cascade fetch optional @ManyToOne ► M F Beschreibung Entitätsklasse Angabe der Kaskadierungsoperationen definiert Ladeverhalten des Attributs erlaubt Null-Werte gibt an ob die Assoziation belegt sein muss hat für primitive Java Typen keine Wirkung Typ Default Class Typ des Attributs CascadeType[] FetchType EAGER Boolean true - Account hat ein person Attribut als Komposition @Entity public class Account implements Serializable { @Id @GeneratedValue private Long id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false) private Person person; Besitzer der Assoziation - 1:N Beziehung durch Fremdschlüssel gemapped - N-Seite ist immer Besitzer der Assoziation ► Konto ist N-Seite @Entity public class Person implements Serializable { @Id @GeneratedValue private Long id; @OneToMany(mappedBy="person", cascade = CascadeType.ALL) private List<Account> accounts; - die Refernezielle Integrität muss manuell gesetzt werden @Entity public class Person implements Serializable { public void addAccount(Account account){ this.accounts.add(account); account.setPerson(this); } public void removeAccount(Account account){ this.accounts.remove(account); account.setPerson(null); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 188 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.7 Verbindungstabelle - kann auf alle Beziehungstypen angewendet werden - durch die Annotation @JoinTable - @JoinColumns definiert Tabellen- und Feldnamen - definiert Kompatibiltät zu bestehendem Schema - ermöglicht Nachvollziehbarkeit - durch zusätzliche Spalten in der Jointable ► z.B. Timestamp Annotation @JoinTable ► M F Parameter Beschreibung Name der Relationstabelle name Tabellenschema schema Tabellenkatalog catalog PK Spalten der führenden Entity joinColumns inverseJoinColumn PK Spalten der nichtführenden Entity uniqueConstraint Unique-Constraints, die auf der Relationstabelle definiert werden sollen Typ String String String JoinColumn[] JoinColumn[] Default DB Schema DB Katalog UniqueConstraint[] Aufgabe ► Beziehungstabelle Beziehungstabelle - testen Sie die Person – Konto Beziehung - definieren Sie eine JoinTable ► T_PERSON_KONTO @Entity public class Account implements Serializable { @ManyToOne(cascade=CascadeType.ALL ,fetch= FetchType.EAGER) @JoinTable( name = "T_PERSON_KONTO", joinColumns = { @JoinColumn( name = "Konto_PK") }, inverseJoinColumns = { @JoinColumn(name = "Person_PK") }) private Person person; - testen Sie bi-direktional assertEquals(3, bank.getPerson(p.getName()).getAccounts().size()); assertEquals("123-0", bank.getAccount("Privatkonto").getNr()); assertEquals("Name", bank.getAccount("Sparkonto").getPerson().getName()); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 189 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.8 @ManyToMany - werden immer durch eine Verbindungstabelle abgebildet Annotation @ManyToMany ► M F Parameter Beschreibung Entitätsklasse targetEntity Angabe der Kaskadierungsoperationen cascade definiert Ladeverhalten des Attributs fetch definiert Attribut der führenden Entity mappedBy Typ Default Class Typ des Attributs CascadeType[] FetchType LAZY String - am Beispiel Verwalter – Konto @Entity public class Trustee implements Serializable { @Id @GeneratedValue private Long id; @ManyToMany(mappedBy = "trustees") private List<Account> accounts; @Entity public class Account implements Serializable { @Id @GeneratedValue private Long id; @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) private List<Trustee> trustees; Auzfgabe ► Verwalter – Konto - testen Sie die entsprechende @ManyToMany Beziehung - die JoinTable wird per Default aus den Namen der beiden Tabellen zusammengesetzt - beidseitig müssen die Funktionalitäten zur referenziellen Integrität ermöglicht werden public void addAccount(Account account) { this.accounts.add(account); account.getTrustees().add(this); } public void removeAccount(Account account) { this.accounts.remove(account); account.getTrustees().remove(this); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 190 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Assoziationen 24.9 Transitive Persistenz - bezeichnet alle Objekte, die von einem persistenten Objekt erreichbar sind - durch Kaskadieren von Persistenzoperationen - erlaubt die Weitergabe von Entity-Operationen ► persist(), merge(), delete() - durch die Annotation ► CascadeType - bei allen Beziehungen ► @OneToOne, @OneToMany, @ManyToOne und @ManyToMany @ManyToMany(cascade = CascadeType.ALL) - A.persist() persistiert auch alle an A hängenden Objekte B - weitere CascadeTypes überschreiben die CascadeTypes der Java Persistence API - Annotation @org.hibernate.annotations.Cascade - definiert CascadeType mit Annotation @org.hibernate.annotations.CascadeType @org.hibernate.annotations.Cascade(value = { org.hibernate.annotations.CascadeType.SAVE_UPDATE, org.hibernate.annotations.CascadeType.REPLICATE }) CascadeTypes ► JPA vs. Hibernate CascadeTypes JPA Hibernate Beschreibung Übergang ► managed Entity commit() oder flush() persistiert Objekt in der Datensource Übergang ► detached Entity zu managed Entity MERGE MERGE Übergang ► managed Entity zu detached Entity DETACH Übergang ► removed Entity REMOVE REMOVE commit() oder flush() löscht Objekt in der Datensource Synchronisiert die Entity Instanz mit der Datensource. REFRESH REFRESH Änderungen innerhalb der Entity werden dabei überschrieben entspricht javax.persistence.REMOVE DELETE DELETE entspricht casade = { PERSIST, MERGE, DETACH, REMOVE, REFRESH } ALL save(Object entity) oder update(Object entity) wird durchgereicht SAVE_UPDATE Objekt unter Verwendung der existierenden Id in der Datenbank persistiert REPLICATE DELETE_ORPHAN Objekte, die nicht mehr referenziert werden, werden gelöscht LockMode für pessimistisches Locking wird durchgereicht LOCK Objekt wird aus der Session gelöscht EVICT Beinhaltet … und SAVE_UPDATE, DELETE, EVICT und LOCK. ALL PERSIST PERSIST © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 191 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Vererbung 25 Vererbung - JPA definiert drei verschiedene Vererbungsstrategien SINGLE_TABLE - eine Tabelle als flache Hierarchie - Unterscheidungsmerkmal ist eine Diskriminator-Spalte - Polymorphe Abfragen sind möglich TABLE_PER_CLASS ► optional - eine Tabelle pro konkreter Entity-Klasse - jede Tabelle enthält ALLE Attribute ► auch der Superclass - keine polymorphen Abfragen möglich ► SQL UNION als Behelf JOINED - eine Tabelle pro Klasse ►auch abstakte - eine Tabelle pro Klasse einer Vererbungshierarchie - polymorphe Abfragen sind möglich ► nicht performant 25.1 Single_Table - einfachste Möglichkeit ► Defaultstrategie - Klassen werden in einer einzigen Tabelle abgebildet - als flache Hirarchie - @Inheritance bestimmt Vererbungsstrategie - @DiscriminatorValue definiert Tabelleneintrag - @DiscriminatorColumn definiert Typ und Name der Discriminatorspalte - Typ definiert als Dtype pder String - Name beschreibt Vererbung, z.B: Sparkonto oder Privatkonto Annotation @Inheritance ► C Parameter Beschreibung Vererbungsstrategie strategy Typ Default InheritanceType © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 192 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Vererbung Annotations für die Vererbung Annotation @DiscriminatorValue ► C Parameter Beschreibung Typ Wert der Discriminatorspalte String value Default Annotation @DiscriminatorColumn ► C Parameter Beschreibung Typ Spaltenname String name name Default discriminatorType columnDefinition lenght Spaltentyp [STRING, CHAR, INTEGER] Fragment der SQL Typendefinition Spaltenbreite nur für STRING DTYPE DiskriminatorTyp STRING String entsprechend referenzierte Spalte int 31 - MappedSuperclass definiert ein abstraktes Objekt in einer Vererbungsstrategie - ohne eigene Tabelle Annotation @MappedSuperclass ► C Parameter Beschreibung Typ Default Aufgabe ► Single_Table - testen Sie die Vererbungsstategie Single_Table - abstrakte Klasse Konto bestimmt Vererbungsstrategie mit InheritanceType konkrete Klassen definieren Discriminatorvalue @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) public abstract class Account implements Serializable { @Entity @DiscriminatorValue(value = "Sparkonto") public class Deposit extends Account { @Entity @DiscriminatorValue(value = "Privat") public class Personal extends Account { @Entity @DiscriminatorValue(value = "Euro") public class Euro extends Account { © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 193 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Vererbung 25.2 Table_Per_Class - jede konkrete Klasse in einer eigenen Tabelle - Tabellen eindeutig den Entities zugeordnet Die Persistenzprovider sind gemäss JPA Spezifikation nicht verpflichtet, die TABLE_PER_CLASSTABLE_PER_CLASS-Strategie bereitzustellen. Aufgabe ► Table_Per_Class - testen Sie die Vererbungsstategie Table_Per_Class - abstrakte Klasse bestimmt Vererbungsstrategie Tabellen für konkrete Entitäten erhalten auch die Attribute der geerbten Klasse @Entity @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) public abstract class Account implements Serializable { @Id @GeneratedValue(strategy = GenerationType.TABLE) private Long id; @Entity public class Deposit extends Account { @Entity public class Personal extends Account { @Entity public class Euro extends Account { - JBoss verlangt TABLE-Generation-Stategy bei "Mapped Tables" © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 194 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Vererbung 25.3 Joined - jede abstrakte und jede konkrete Klasse hat eigene Tabelle - jede Tabelle hat einen Primärschlüssel - Primärschlüssel ist auch Fremdschlüssel zur Superklasse - optionale Definition möglich für Implementierungen anderer Persistenzprovider Aufgabe ► Joined - testen Sie die Vererbungsstategie Joined - abstrakte Klasse bestimmt Vererbungsstrategie alle Objekt der Vererbungsstategie werden in eigenen Tabellen gemapped - abstrakte und konkrete Entities @Entity @Inheritance(strategy = InheritanceType.JOINED) public abstract class Account implements Serializable { @Id @GeneratedValue private Long id; @Entity public class Deposit extends Account { @Entity public class Personal extends Account { @Entity public class Euro extends Account { © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 195 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Vererbung Zusammenfassung ► Vererbungsstrategien Joined Table_Per_Class Single_Table Vererbungsstrategie Strategie Begründung Vorteil Nachteil Vorteil gute Performance, da polymorphe Abfragen nur immer eine Tabelle betreffen geeignet für wenig Attribute polymorphe Abfragen grosse Vererbungshierarchien erzeugen sehr grosse Tabellen redundante Spalten schlechte Datenintegrität da Felder der abgeleiteten Klassen NULL Werte haben geeignet für Vererbungshierarchien ohne polymorphe Abfragen und Beziehungen Abfragen auf konkrete Klassen sehr einfach und performant Tabellenstruktur ist abhängig von den Superklassen Nachteil polymorphe Abfragen nicht optimal unterstützt Vorteil Nachteil Datenbankintegrität wird nicht verletzt Attribute in den Subklassen haben keine NULL Werte polymorphe Abfragen und Assoziationen sind möglich komplexe Abfragen schlechte Performance Abfrage auf eine konkrete Klasse benötigt Inner-Joins Vererbungsstategieren in der Praxis Vererbungsstategieren Eigeschaft SINGLE_TABLE wenig wenig Attribute viele Attribute preformant polymorphe Queries TABLE_PER_CLASS JOINED () nur konkrete Querries komplexe Hirarchie Querries nur auf eine Tabelle Union Select Inner / Outer Joins - Joined ► für Abfragen über alle Kontos sind Outer Joins notwendig SELECT a.name, a.saldo, a.currency, p.debitInterest, d.interest FROM Account AS a LEFT OUTER JOIN Personal AS p ON a.id = p.id LEFT OUTER JOIN Deposit AS d ON a.id = d.id WHERE ... © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 196 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Collections 26 Collections - Assoziationen zwischen Entities werden als Collections umgesetzt - auch Verwendung von Value Types - repräsentieren keine eigenständigen Entities innerhalb der Datenbank ► z.B. Liste von Strings - Collections als Attribute von persistenten Klassen - durch Deklaration des Typs als Interface Folgende Interfaces werden unterstützt: - java.util.Set / java.util.SortedSet java.util.Collection java.util.List java.util.Map / java.util.SortedMap selbst definierte Interfaces - org.hibernate.usertype.UserCollectionType Die Die Verwendung von Collections in persistenten Klassen erlaubt nur die unterstützten Interfaces. Interfaces. folgender Code wirft eine LaufzeitLaufzeit-Exception Verwalter v = bank.getVerwalter(1L); Set kontos = v.getKontos(); // ok HashSet my_kontos = (HashSet) v.getKontos(); // RuntimeException - Hibernate als Persistenzprovider ersetzt HashSet während "persist" durch eigene Implementierung - dabei werden durch Entity referenzierte Collection-Instanzvariablen persistiert und referenzlose Collection-Instanzvariablen werden gelöscht - daher ► hashcode und equals sinnvoll überschreiben - zwei Entities dürfen nicht auf gleiche Collection-Instanz verweisen - Hibernate unterscheidet nicht zwischen einer Null-Referenz auf eine Collection und einer leeren Collection © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 197 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Collections 26.1 Collections mit Index - indexierte Collections ► z. B. List, Map oder Arrays - erlauben Zugriff über Index - definieren Indexspalte ► bzw. ein Key bei Maps - enthält den Index der Collection - List und Array erlauben nur Integer - Map erlaubt beliebiger Basistyp 26.2 Collection von Basistypen - @ElemetCollection erlaubt eine Collection von Basistypen ► z.B. String Annotation @ElementCollection ► M F Parameter Beschreibung Typ Ladestrategie der Collection FetchType fetch referenzierte Klasse java.lang.Class targetClass Default LAZY Klasse @Entity public class Euro extends Account implements Serializable{ @ElementCollection private Set<String> coupons = new HashSet<String>(); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 198 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27 Datenbankabfragen mittels Abfragen Entities in einer Datenbank finden - JPQL ► Java Persistence Query Language - mit dem Query Interface - zentrale Schnittstelle - DML ► INSERT / DELETE / UPDATE - DRL ► SELECT - Parametrisierung der Query - Iteration des Resultset - Flushing- / Lockingparameter - HQL ► Hibernate Query Language - starke, objektorientierte Abfragesprache - Criteria API - objektorientierte Abfragen - durch Aufruf einer normalen API formuliert - Native SQL - Abfragen per ANSI SQL formuliert 27.1 Query Interface - zentrale Schnittstelle zur Ausführung von Abfragen - immer wenn Primärschlüssel einer Entity nicht bekannt ist - bei PK ► EntityManager.find() oder EntityManager.getReference() - Suchkriterien zum Finden der Entities - Query-Instanz wird mit Hilfe des EntityManager erzeugt - String-Parameter muss eine gültige JPQL-Abfrage definieren - NativeQuery( ) definiert einen native SQL String ► datenbankspezifisch - Datenbankunabhängigkeit geht verloren public List<Konto> findAccountPersonAddress(String konto, String name, String city) { Query query = manager.createQuery("SELECT k FROM Konto k " + "WHERE k.name LIKE :konto AND k.person.name LIKE :name " + "AND k.person.address.city LIKE :city"); query.setParameter("konto", konto); query.setParameter("name", name); query.setParameter("city", city); return query.getResultList(); } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 199 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen Methoden des Query Interface QueryInterface ► Ausschnitt Methode Beschreibung List getResultList( getResultList( ) Object getSingleResult( getSingleResult( ) int executeUpdate( executeUpdate( ) Query setMaxResults() setMaxResults() Query setFirstResults() Query setHint() Query setParameter() Query setFlushMode() 27.2 Das Ergebnis wird als Liste zurückgegeben, das heisst, das Resultat der Abfrage befindet sich komplett im Speicher Ist von vornherein bekannt, dass eine Abfrage nur ein einziges Objekt zurück liefert, kann diese Methode verwendet werden, um den Umweg über die Liste zu sparen Ermöglicht UPDATE und DELETE Anweisungen, die sich auf eine ganze Reihe von Entity Beans auswirken könnnen. erlaubt ausschnittweises oder seitenweises Eingrenzen der Ergebnismenge setzen herstellerspezifischer Parameter, z.B. org.hibernate.timeout setzt die Parameter einer dynamischen Query setzt den Synchronisationsmodus AUTO synchronisiert Persistenzkontext und DB vor der Abfrage COMMIT Persistenzkontext synchronisiert erst bei COMMIT Ausführen von Abfragen Query Interface liefert: - einfache Instanzen der entsprechenden Wrapperklassen ► Integer, Long, etc. - Object Array List<Konto> kontos = query.getResultList(); Vector<Konto> inhaberKontos = new Vector<Kontos>(); for (Object o : kontos) { inhaberKontos.add((Konto) o); } - auch als benutzerdefinierter Arrays sinnvoll - InhaberKonto @Entity(name = "Person") @SqlResultSetMapping(name = "PersonWithMultipleAccounts", entities = { @EntityResult(entityClass = entity.Person.class, fields = { @FieldResult(name = "name", column = "name") }) }) public class Person implements Serializable { © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 200 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.3 Eingrenzung der Abfrage - setMaxResults(int maxResults) grenzt die Ergebnismenge ein - setFirstResult(int firstResult) setzt einen Zeiger in der Ergebnismenge - Listenweise Ausgabe der Elemente public List<Konto> findAccountPersonAddress( String konto, String name, String city, int offset, int range) { ... query. setFirstResult(offset). setMaxResults(range); 27.4 dynamische Abfragen - benannte Parameter public List<Konto> findAccountPersonAddress(String konto, String name, String city) { Query query = manager.createQuery("SELECT k FROM Konto k " + "WHERE k.name LIKE :konto AND k.person.name LIKE :name " + "AND k.person.address.city LIKE :city"); query.setParameter("konto", konto); query.setParameter("name", name); query.setParameter("city", city); © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 201 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.5 NamedQuery - wiederverwendbar - für die Entity definiert - Definition per Metadaten - per Annotation - per XML ► orm.xml - als JPQL - auch als Native SQL @Entity @NamedQueries({ @NamedQuery(name = "Person.findAll", query = "from Person p"), @NamedQuery(name = "Person.findByName", query = "from Person p where p.name:=name") }) public class Person implements Serializable { .. } Abfragen Abfragen mit NamedQueries NamedQueries - durch die Fassade - parametrierbar public List<Person> findPersonByName(String name) { Query query = manager.createNamedQuery("Person.findByName"); query.setParameter("name", name); List<Person> persons = query.getResultList(); return persons; } © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 202 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.6 JPQL Java Persistence Query Language - Abfragesprache - nicht case sensitive - aber ► Javaklassen und Properties entsprechend korrekt angeben - objektorientiert - Abfragen von Objekten über deren Vererbungsbeziehung FROM Person - JPQL ► Abfrage der Entities vom Typ Person oder einem Subtyp - nativ SQL ► Abfrage der Daten aus der Tabelle Person 27.7 FROM - Abfrage der Entity-Klasse from entity.Person from Person // Hibernate-Mappings Attribute auto-import = true (DEFAULT) from Person as p from Person p // mit Alias from Person, Konto // kartesisches Produkt © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 203 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.8 WHERE - Einschränkung der Ergebnismenge from Person as p where p.name = 'Name' from Person where name = 'Name' from Person as p where p.name like '%Name%' Formulierung von Bedingungen - praktisch alle SQL bekannten Ausdrücke Bedingungen Ausdruck Beschreibung and, or, not +, -, *, / =, >=, <=, <>, !=, like () is null, is not null in, not in, between, is empty, is not empty, member of, not member of case ... when ... then ... else ... end, case when ... then ... else ... end ||, ||, concat(..., ...) current_date(), current_time(), current_timestamp(), second(), minute(), hour(), day() day(), month(), year() substring(), trim(), lower(), upper(), length(), locate() abs(), sqrt(), bit_length(), mod() str() cast(), extract() size(), minelement(), maxelement(), minindex(), maxindex() sign(), rtrim(), sin() logische Operatoren zur Verknüpfung von Ausdrücken mathematische Operatoren Vergleichsoperatoren Klammern zur Gruppierung von Ausdrücken Vergleiche auf Null Ausdrücke zum Umgang mit Mengen und Bereichen (Collections etc.) Bedingungen mit Alternativen String Verknüpfungen Verwendung von Zeit und Datum Verwendung von Strings sonstige mathematische Operatoren Umwandlung in einen String Casts zur Umwandlung in HQL-Datentypen sonstige Ausdrücke zum Umgang mit Collections sonstige SQL-Funktionen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 204 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen Beispiele: from Person p where p.kontos.size > 3 // mit mehr als drei Konten from Person p where p.name between 'A' and 'M' from Person p where p.name in ('Markus', 'Martin') from Konto k where k.name like '%konto%' 27.9 ORDER BY - Sortierung der Ergebnismenge - nur über die aktuelle Klasse (Datenbank Tabelle) from Person order by name from Person order by name asc, konto.name desc © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 205 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.10 Verbundoperationen - liefern Kombinationen der beteiligten Entities - inner join / join ► 1:1-Zuordnung. Elemente ohne Zuordnung sind ausgeschlossen - left outer join / left join ►1:1-Zuordnung. inklusive Elemente ohne Zuordnung der linken Tabelle - right outer join / right join ► inklusive Elemente ohne Zuordnung der rechten Tabelle - full join ► kartesisches Produkt select p, konto // alle Personen mit Konten from Person p inner join p.kontos konto select p, k from Person p inner join p.kontos k with k.name like '%konto%' 27.11 FETCH Fetch Strategien durch die Abfrage definiert ► analog LAZY / EAGER - Fetch -Joins - erlaubt Abfragen von Beziehungen und Collections inklusive der "Parent Objects" - überschreibt "outer-join" und "lazy" Deklaration für Beziehungen und Collectionen - Einschränkungen von Fetch-Joins - Ergebnismenge kann nicht iteriert werden - with - Konstrukt nicht geeignet - setMaxResults() / setFirstResult() kann nicht verwendet werden - Duplikate der Parents sind möglich from Verwalter v left join fetch v.konten // mit fetch Strategie © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 206 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.12 SELECT - definiert Ergebnismenge der Objekte und Attribute select k from Person p inner join p.konten k // Instanzen der FROM Entities // also Konto-Instanzen select p, k from Person p inner join p.konten k // Liste von Object[] // Object[0] ist Person Object // Object[1] ist Konto Object select p, k.name from Person p inner join p.konten k // Liste von Object[] // Object[0] ist Person Object // Object[1] ist String Object - definiert Ergebnismenge der Objekte und Attribute select new list(i, k) from Inhaber i inner join i.konten k // List als Ergebnistyp select new InhaberKonto(i, k) // typisiertes Java Object from Inhaber i // InhaberKonto als Ergebnis inner join i.konten k // (selbst definierte Javaklasse) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 207 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.13 Aggregat-Funktionen - zur Konsolidierung oder Verdichtung der Ergebnismenge - distributive Funktionen - sum( ), min( ), max( ), count(*), count( ), count(distinct ...), count(all ...) - algebraische Funktionen - avg( ) select count(*) from Person // Anzahl aller Personen select count(distinct p.name) from Person p // Anzahl aller eindeutiger Namen 27.14 GROUP BY - Gruppieren von Aggregat-Funktionen select t.name, count(k) from Konto k inner join k.trustee t group by t.name // Liste aller Verwalter // mit Anzahl Konten © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 208 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datenbankabfragen 27.15 Polymorphe Abfragen - SQL kennt das Konzept der Vererbung nicht - JPQL unterstüzt polymorphe Abfragen - liefert Ergebnismenge von Entity-Instanzen einer gemeinsamen Vererbungshierarchie from Konto // liefert auch // Instanzen von Subklassen from java.lang.Object // alle persistenten Objekte 27.16 Subqueries - falls die darunterliegende Datenbank Subqueries verwendet from Konto kavg where kavg.saldo > ( select avg(k.size) from Konto k ) // Konten die mehr Saldo als // das Durchschnittskonto haben from Konto k where not (k.nr, k.name) in ( select pk.saldo from Personal pk ) // mit Wertemenge > 1 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 209 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datentypen 28 Datentypen Datentypen - Datenbankzugriffe resultieren in Performance-Problemen - geeignete Fetching-Strategie wählen - geeigneter Typ wählen - Fetching-Strategy bei Attributen @Basic(fetch = FetchType.LAZY) private Object grosseDatenMenge; - Fetching-Strategy bei Beziehungen @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER) private Address address; - Fetch Join Syntax from [left [outer]] / [inner] join fetch association 28.1 Fetching-Strategien JPA Spezifikation definiert zwei Fetching-Strategien: - Lazy Loading - Daten erst laden wenn ein Zugriff auf das Attribut oder das Objekt erfolgt - Persistence Provider ist nicht verpflichtet Lazy Loading zu unterstützen - Umfang einer Umsetzung von Lazy Loading ungenau definiert - Eager Loading - Daten sofort vollständig laden JPA unterstützt unterstützt Lazy Loading Loading - Entity muss vom EntityManager verwaltet werden - Zugriff auf nicht geladenes Attribut einer detached Entity wirft Exception Ladestrategien für Attribute Annotation @Basic ► M F Parameter Beschreibung definiert Ladeverhalten des Attribut fetch erlaubt Null-Werte, hat für primitive Java Typen keine Wirkung optional Typ Default FetchType EAGER Boolean true © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 210 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datentypen Zusammenfassung ► FetchingFetching-Strategien Fetching Annotation @Basic(fetch = FetchType.EAGER / LAZY) @OneToOne(fetch = FetchType.EAGER / LAZY) @ManyToOne(fetch = FetchType.EAGER / LAZY) @OneToMany(fetch = FetchType.EAGER / LAZY) @ManyToMany(fetch = FetchType.EAGER / LAZY) Defaultwert FetchType.EAGER FetchType.EAGER FetchType.EAGER FetchType.LAZY FetchType.LAZY JPQL Fetch Fetch Joins - Spezifikation definiert für JPQL-Abfragen Fetch Joins - Beziehungen zwischen Entities werden bei der Ausführung der Abfrage geladen - als Inner Join implementiert - Loading Strategie (EAGER / LAZY) anwendbar - Hibernate bietet zusätzliche Optionen - Batch-Fetching - Subselect-Fetching 28.2 grosse Objekte - umfangreiche Daten (Streams) werden in spezielle Datentypen abgelegt - meistens generische Objekte oder Strings - @Lob deklariert Attribut als Large OBject - Datenbank ist verantwortlich für die Abbildung ► MySQL z.B. als BLOB BinaryLargeObject Annotation @Lob ► M F Parameter Beschreibung Typ Default - @Lob wird oft im Zusammenhang mit @Basic verwendet - um LazyLoading für Large Objects zu definieren. @Lob @Basic(fetch = FetchType.LAZY) private Object grosseDatenMenge; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 211 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Datentypen 28.3 Datums- und Zeitwerte - Datums- und Zeitwerte sind für die Speicherung in der Datenbank nicht vordefiniert - java.util.Calender java.util.Date - @Temporal definiert Datenbankrepräsentation - DATE entspricht java.sql.Date - TIME entspricht java.sql.Time - TIMESTAMP entspricht java.sql.Timestamp Annotation @Temporal ► M F Parameter Beschreibung TemporalType definiert Speichertyp Typ Default DATE TIME TIMESTAMP TIMESTAMP @Temporal(TemporalType.DATE) private java.sql.Date startDatum; 28.4 Aufzählungen - Java SE 5.0 kennt Aufzählungstyp ENUM - @Enumerated deklariert Aufzählungstyp und definiert Art der Persistierung - ORDINAL : Wert wird als Zahl beginnend mit 0 gespeichert - STRING : Wert wird als String gespeichert Annotation @Enumerated ► M F Parameter Beschreibung value definiert Art der Persistierung ORDINAL oder STRING Typ Default EnumType Beispiel ► Kontotyp als Aufzählungstyp public enum KontoTyp { PRIVATKONTO, SPARKONTO, ANLEGEKONTO } @Enumerated(EnumType.ORDINAL) private KontoTyp kontoTyp; © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 212 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionen der Persistence Unit 29 Transaktionen der Persistence Unit - verschiedene Anwendungsszenarien für transaktionale Operationen ► Patterns - basieren auf der Verwendung von - JDBC Connections - Java Transaction API (JTA) - optimistisches Locking - beim Schreiben wird geprüft ob sich die Daten verändert haben - implementiert durch die Verwendung von Versionsattributen @Version - pessimistisches Locking - lesender Client sperrt Daten - implementiert durch API die SELECT FOR UPDATE der Datenbank umsetzt - Repeatable-Read-Semantik definiert Caching innerhalb Persistenz-Session - dabei muss jede Datenbankoperation innerhalb einer Transaktion laufen - auch reine Leseoperationen - aktiver Auto-Commit-Modus wird (durch Hibernate) deaktiviert - sollte generell nicht in Verbindung mit Hibernate eingesetzt werden Verwendung von Transaktionen unterscheidet - managed ► innerhalb eines JEE Application Servers - BMT (Bean Managed Transactions) - CMT (Container Managed Transactions) - non-managed ► in einer JSE Anwendung - Spring - Web-Container © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 213 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionen der Persistence Unit 29.1 Optimistisches Locking optimistisches Locking bedeutet ► meistens geht alles gut - hohe Performance - gute Skalierbarkeit Praxis ► wenn keine Überschneidungen von Änderungen durch parallele Transaktionen - Auftreten einer Überschneidung wird durch aufwändige, manuelle Korrektur behoben - z.B. durch Versionierung der Datensätze ► Version Pattern / Timestamp in Tabelle - manueller Ansatz nur bei kleinen, trivialen Persistenzlösungen praktikabel - manuelle Überprüfung eines komplexen Objektgraphen nicht einfach oder auch Last Commit Wins ► Verwirrungen seitens der User manuelle Überprüfung mittels Versionsvergleich für jede Entity ► Version Pattern - Versionsattribut der Entities wird automatisch beim Commit hochgezählt 29.2 Versionsprüfung durch Version Number - Entity Manager prüft beim Speichern auf Zustandsänderungen der Daten - durch ein Commit aktualisiert - JPA definiert automatische Versionsüberprüfung durch Version-Attribut - mit @Version annotiertes Attribut darf durch Applikation nicht verändert werden - Attribut wird bei jeder Veränderung hochgezählt Annotation @Version ► M F Parameter Beschreibung Typ Default Beispiel @Version @Column(name="Versionfeld") private int version; das Version Pattern ist durch die JPA Spezifikation implementiert © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 214 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionen der Persistence Unit 29.3 Pessimistisches Locking Praxis ► bei häufigen Kollisionen zwischen konkurrierenden Transaktionen - restriktives Vorgehen verlangt - Tabellenzeilen werden explizit gesperrt - konkurrierende Transaktion erhält Fehlermeldung - konkurrierende Transaktion muss warten - verschlechtert Gesamtperformance des Systems aufgrund wartenden Transaktionen LockingLocking-Mechanismus - um Deadlocks innerhalb der Datenbank zu vermeiden - Hibernate nutzt für pessimistisches Locking die Datenbank Funktionalität - Hibernate setzt nie Locks auf Entity-Objekte im Speicher! - Klasse LockMode definiert verschiedene Lock-Modi - es stehen nicht immer alle Modi zur Verfügung (Datenbankabhängig) falls gewünschter Lock-Modus nicht unterstützt wird wählt Hibernate automatisch einen verwandten, verfügbaren Modus LockMode definiert verschiede LockLock-Modus LockMode Parameter NONE READ UPGRADE UPGRADE_NOWAIT WRITE Beschreibung Beschreibung Es wird kein Lock auf Zeilen in der Datenbank gesetzt. Mit diesem Modus wird beim Lesen eines Datensatzes nur auf die Datenbank zugegriffen, wenn sich die entsprechende Entity nicht im Cache befindet. Dieser Lockmodus weist Hibernate an, direkt auf die Datenbank zuzugreifen und eine Versionsüberprüfung der betroffenen Entities durchzuführen. Sinnvoll z. B. bei Verwendung von Detached Entities. Dieser Lockmodus wird von Hibernate automatisch verwendet, wenn als Isolationsebene Repeatable Read oder Serializable ausgewählt wurde. Wird für pessimistisches Locking verwendet. Es wird mit SELECT ... FOR UPDATE ein Lock auf die Tabellenzeilen gesetzt, wenn die Datenbank dieses Feature unterstützt. Verhält sich wie UPGRADE. Durch ein SELECT ... FOR UPDATE NOWAIT, welches in Oracle Datenbanken verfügbar ist, wird die DB angewiesen, nicht darauf zu warten, falls die selektierte Tabellenzeile bereits gelockt ist, sondern eine Locking Exception zu werfen. Ein "interner" Modus, der automatisch von Hibernate verwendet wird, wenn ein Datensatz aktualisiert oder eingefügt wird. Dieser Modus kann nicht explizit durch den User verwendet werden. LockLock-Modi erlauben pessimistisches Locking auf feingranularer feingranularer Ebene © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 215 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Transaktionen der Persistence Unit P Idioms Lerninhalte Lerninhalte Design Pattern Idioms © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 216 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns 30 Design Patterns wiki Entwurfsmuster (engl. (engl. design patterns) patterns) sind bewährte LösungsLösungs-Schablonen für wiederkehrende Entwurfsprobleme in Softwarearchitektur und Softwareentwicklung. Softwareentwicklung. Sie stellen damit eine wiederverwendbare Vorlage Vorlage zur Problemlösung dar, die in einem bestimmten Zusammenhang einsetzbar ist. In den letzten Jahren hat der Ansatz der Entwurfsmuster auch zunehmendes Interesse im Bereich der MenschMensch-ComputerComputer-Interaktion gefunden. Aber auch außerhalb der Informatik finden Entwurfsmuster immer mehr Eingang. 30.1 Zweck - Pattern heisst übersetzt Muster oder Beispiel - Design Patterns sind wiederverwendbare Lösungen - zu häufig auftretenden Problemen in der Software Entwicklung - Design Patterns kommen aus der Praxis - widerspiegeln die Erfahrung von Experten - Design Pattern erhöhen die Qualität der Software - erleichtern die Kommunikation zwischen den Entwicklern 30.2 Geschichtliches - Idee stammt ursprünglich aus der Architektur - 1977 - Alexander schreibt ein Buch über die Verwendung von Mustern in der Architektur - 1987 - Cunningham und Beck entwerfen fünf Patterns für die Programmierung von User-Interfaces - Durchbruch der Software Patterns - 1994 - Autoren Gamma, Helm, Vlissides und Johnson schreiben das Buch "Design Patterns" - ISBN 3-8273-2199-9, ISBN-10:3-8273-2199-9, EAN:9783827330437 - Addison Wesley Verlag, Juli 2004 - 6. Auflage / 504 Seiten das Buch "Design "Design Patterns" Patterns" entwi entwickelte sich zu einem der einflussreichsten Computerb Computerbücher überhaupt und ist auch unter dem Begriff GoF (Gang (Gang of Four) Four) bekannt © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 217 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns 30.3 JEE Pattern Im Zusammenhang mit JEE Applikationen sind spezielle Anforderungen erwünscht wie: - Transparenz - Stabilität - Performance JEE Entwurfsmuster stellen Idioms dar - also programmiersprache- und oft auch releaseabhängige Lösungen Idioms der Logik Tier Tier - Business Delegate ► kaspselt Logik Session Facade ► kapselt Komplexität Service Locator ► kapselt Technologie Service Activator ► kapselt teure Prozesse Transfere Object ► kapselt Data Objekte Transfere Object Assembler ► kapselt mehrere Transfere Objekte Composite Entity ► kapselt Graphen von Data Objekten Data Access Object ► kapselt Datenquelle Value List Handler ► kapselt Queries und deren Resultate Die diskutierten Idioms sind nicht EJB/JPA spezifisch, sondern gelten im Umgang mit JEE Serverkomponenten. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 218 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns 30.4 Service Locator - Suche und Erzeugung von EJB ist zeitintensiv und fehleranfällig - Namensdienste (JNDI, ...) - Komponentenverteilung (RMI-IIOP) - Factorycaching (Interfaces) Problem - Zugriff auf eine EJB ► teuer und fehleranfällig - Server wird referenziert - Name muss zuerst von einem DNS aufgelöst werden - Namensdienst wird initialisiert - benötigt produktspezifische Informationen - Verbindung zum Server wird hergestellt - basiert auf CORBA-Technologie Service Locator Idiom stellt ein Entwurfsmuster zur Kapselung der Technologie Technologie und eine Performancesteigerung zur Verfügung. Lösung - bereits instanziierte Instanz des Proxy Objektes wird gecached - bereits instanziierte Ressourcen werden gecached - Handels (robuste Referenzen) werden gecached - JNDI Technologie wird transparent für den Client © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 219 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns 30.5 Business Delegate - Remotezugriff erfordert die Implementation entsprechender Technologie - z.B. RMI-IIOP - Client ist nicht an Technologie, sondern an Geschäftslogik interessiert - Business Delegate Idiom ermöglicht Kapselung der Technologie - Vereinfachung der Schnittstelle zur Geschäftslogik Problem - Zugriff auf die Geschäftslogik in einem EJB-Container erfordert Remotezugriff - viel komplexer und zeitintensiver als ein Lokalzugriff Exceptions müssen abgefangen werden Business Delegate Idiom stellt ein Entwurfsmuster zur Kapselung der Business Services dar und entkoppelt die PresentationPresentation-Tier Clients. Lösung - die einzelnen Beans werden über eine zentrale Session Facade angesprochen - Facade hält die Instanzen der verschiedenen Business Services stellt diese dem Client in einer Schnittstelle zur Verfügung kann auch Informationen an die anderen Business Services weitergeben - Client produziert "Events" die vom Business Delegate "verteilt" werden - stellt einen einfachen Zugriff auf die Geschäftslogik zur Verfügung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 220 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns 30.6 Session Facade - Geschäftslogik liegt typischerweise im EJB Container - durch Komponenten (EJBs) abgebildet - Client muss Zusammenhang der einzelnen Komponenten im Container kennen - Client möchte eine Schnittstelle, die ein Use Case abbildet - korrekte Abbildung des Anwendungsfalles ist wichtig Problem - Entity Beans bilden persistente Objekte ab - repräsentieren aber lediglich den Zustand der darunterliegenden Datenbank - EJBs sind vom Client zu trennen ► zu kapseln - in Bezug auf Wiederverwendbarkeit - in Bezug auf Transaktionssteuerung - in Bezug auf Zustandserhaltung Session Facade Idiom kapselt die ContainerContainer-Komponenten durch ein Session Bean Lösung - Abschirmung und Entkoppelung des Client vor Subsystemen ► EJBs - Erhalt der Unabhängigkeit der Subsysteme - Vereinfachung der Business Schnittstelle - Implementierung von allgemeinen Diensten wie Caching, Autorisierung, etc. - Zustandsverwaltung des Client - Transaktionssteuerung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 221 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns 30.7 JEE Entwurfsmuster JEE Idioms Entwurfsmuster Service Locator Business Delegate Session Facade Value Object Message Façade Service Activator EJB Command Business Interface DTO Factory Data Transfer Hash Map Value List Handler Handler Data Transfer Row Set Data Access Object Version Number Number Muster zur Generierung von Primärschlüsselwerten Beschreibung Bedeutung für EJB kapselt teure Technologien kapselt Businesslogik, vereinfacht Zugriff kapselt die Container Komponenten kapselt Business Data relevant obsolet, da keine RemoteExeptions durch die Spezifikation erzwungen obsolet, Custom DTO relevant nutzt asynchrone Kommunikation relevant Möglichkeit zur Gestaltung der Session Bean, durch Entkopplung des Clients stellt Konsistenz zwischen Beanklasse und Businessinterface sicher Erzeugung eines DTO durch Factory generische Variante zum DTO serverseitiges Speichern von Ergebnismengen disconnected RowSet für Serveranwendung ohne Entity Beans kapselt den Datenbank Zugriff Attribut kontrolliert Lost-Update-Problematik Generierung von Business Keys relevant obsolet für Custom DTO relevant relevant relevant relevant relevant, mit JPA jedoch leistungsfähiger in Spezifikation integriert in Spezifikation integriert © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 222 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Design Patterns Q Regeln Lerninhalte EJB Programmierregeln © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 223 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Programmiereinschränkungen 31 Programmiereinschränkungen Programmiereinschränkungen die folgenden sieben Regeln sollten beachtet werden Threads 1 2 kein Thread Management oder Synchronisation in EJBs EJBs ► Container kontrolliert Lifecycle - ist Aufgabe des Applikationsservers - Bean = einzelner Thread, keine Kongruenz (Gleichheit) - Kontainer kontrolliert Nebenläufigkeit (Concurrency) statische Variablen keine schreibenden Zugriffe auf Klassenvariablen durchführen ► Speicherort bei Cluster unklar - verschiedene Prozesse bei ClusterCluster-Deployment - statische Attribute mit "final" final" deklarieren 3 AWT (Abstract Windwing Toolkit) 4 Dateizugriff 5 6 7 kein stdin / stdout stdout verwenden ► AusgabeAusgabe- / Eingabestream sind nicht definiert - Portabilitäts Portabilitätsproblematik tätsproblematik kein direkter Zugriff auf Dateien ► nicht definierter Speicherort bei ClusterCluster-Deployment - keine Verwendung von java.iojava.io-Package / keine native Libraries SocketSocket-Listener keine Beans an Sockets binden ► Lifecycle Lifecycle nicht kontrollierbar - Container steuert Bean Life Cycle, daher Bean nicht als Socket Server einsetzen - Bean Instanzen dürfen Socket Clients sein this keine this – Referenz als Parameter oder Ereignis eines Methodenaufrufes ► Remotezugriff - SessionContext.getBusinessObject(Class SessionContext.getBusinessObject(Class businessInterface) benützen Systemproperty EJBs dürfen Laufzeitumgebung nicht beeinflussen ► durch den Container kontrolliert - keine ClassClass-Loader erzeugen, abfragen oder JVM anhalten oder Security Manager installieren installieren © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 224 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Programmiereinschränkungen R Deployment Deskriptoren Lerninhalte Deployment Deskriptoren © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 225 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren 32 Deployment Descriptoren - Beschreiben und Bereitstellen der serverseitigen Komponenten - Annotationen - Deployment Descriptoren (überschreiben Annotationen) ejbejb-jar.xml DeploymentDeployment-Descriptor Descriptor ... <enterprise-beans> <entity> <ejb-name>Anwendung1EJB</ejb-name> <home>Anwendung1Home</home> <remote>Anwendung1</remote> <ejb-class>Anwendung1Bean</ejb-class> ... </entity> <session> <ejb-name>Anwendung2EJB</ejb-name> <home>Anwendung2Home</home> <remote>Anwendung2</remote> <ejb-class>Anwendung2Bean</ejb-class> ... </session> ... </enterprise-beans> Verpackt in eine jarjar-Datei (EJB 2.0) <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD EnterpriseJavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd"> <ejb-jar> Verpackt in eine jarjar-Datei (EJB 2.1) <ejb-jar xmlns="http://java.sun.com/xml/ns/JEE" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/JEE http://java.sun.com/xml/ns/JEE/ejb-jar_2_1.xsd" version="2.1"> Verpackt in eine jarjar-Datei (EJB 3.0) <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd" version="3.0"> Versionen unterscheiden zwischen DTDs und XMLXML-Schema. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 226 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren 32.1 EJB Deployment Deskriptoren unterscheiden als: - Deployment Deskriptoren der Spezifikation - EJB - JPA - Vender-spezifische Deployment Deskriptoren - Oracle / Sun - JBoss - IMB / Webshere - Auschnitt von: - ejb-jar.xml ► EJB Standard - jboss.xml ► JBoss EJB Applikation - application.xml ► EJB Standard - application-client.xml ► EJB Standard - jboss-client.jar ► JBoss Client Applikation - jbosscmp-jdbc.xml ► JBoss Mapping 32.1.1 ejb-jar.xml - beschreibt Bean auf logischer Ebene - Namen der Java-Klassen - Namen der Attribute - Transaktionsverhalten - Security Mapping - Spezifikation der Query-Methoden - Resource Referenzen - ejb-jar.xml ENC Elements (ENC = Enterprise Naming Context) - Name ► ejb-jar.xml - Ort ► META-INF-Verzeichnis der Jar-Datei - Root-Element ► ejb-jar © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 227 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren ejb-jar.xml Elementbeschreibung Element Beschreibung Textbeschreibung der ejb-jar-Datei description? Name, der von Tools benutzt wird displaydisplay-name? Pfad, innerhalb der jar-Datei, für jpeg-Bilder (16x16) smallsmall-icon? Pfad, innerhalb der jar-Datei, für jpeg-Bilder (32x32) largelarge-icon? nähere Beschreibung/ Definition der Beans enterprisebean definiert CMP Beziehungen relationships? assemblyssemblydefiniert Transaktionen und Security descriptor? definiert JAR-Datei, die Stubs und Interfaces für Remote-Clients enhält ejbejb-clientclient-jar? ejb-jar.xml Session Bean Elementbeschreibung Element Beschreibung ejbejb-name ejbejb-class remote? local? sessionsession-type transaction transactionion-type description? displaydisplay-name? smallsmall-icon? largelarge-icon? envenv-entry* ejbejb-ref* ejbejb-locallocal-ref securitysecurity-rolerole-ref* securitysecurity-identity* resourceresource-ref* resourceresource-envenv-ref* Spitzname des Beans, dient als Referenz Session-Bean Klasse + Package-Name Remote-Interface Local-Interface Stateful | Stateless Container | Bean Textbeschreibung der ejb-jar-Datei Name, der von Tools benutzt wird Pfad, innerhalb der jar-Datei, für jpeg-Bilder (16x16) Pfad, innerhalb der jar-Datei, für jpeg-Bilder (32x32) Definition von Umgebungsvariablen Definition von Referenzen zu anderen Beans Definition von Referenzen zu lokalen Beans definiert Sicherheitsrollen definiert wie Sicherheitskontexte ermittelt werden können definiert Referenzen zu Ressourcen (z.B. JDBC) bindet Ressourcen-Factories zu JNDI Namen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 228 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren assemblyassembly-descriptor - ermöglicht die Festlegung von - Zugriffsberechtigungen Transaktionen generellem Zusammenspiel von Beans und einer Applikation ejb-jar.xml Assembly-Descriptor Elementbeschreibung Element Beschreibung definiert Security-Rollen securitysecurity-role* methodmethod-permission* container containerner-transaction* excludeexclude-list? 32.2 spezifiziert die einzelnen Methoden, und deren Zugriffsrechte Definition der Transaktionen, der einzelnen Methoden Liste von Methoden, die von niemandem aufgerufen werden dürfen jboss.xml beschreibt Informationen für den Application Server - JNDI-Mapping: Name unter dem das Home-Interface gefunden wird - Resource Referenzen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 229 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren 32.3 jboss.xml ENC Elements - ENC ► Enterprise Naming Context <jboss> <enterprise-beans> <session> <ejb-name>moneyexchange</ejb-name> <jndi-name>ejb/moneyexchange</jndi-name> <resource-ref> <res-ref-name>jdbc/ExchangeTable</res-ref-name> <jndi-name>java:/mySQLDS</jndi-name> </resource-ref> </session> </enterprise-beans> </jboss> 32.4 application.xml beschreibt eine ganze Enterprise Applikation - die graphische Repräsentation zeigt die Struktur des JEE application.xml Schemas © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 230 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren <?xml version="1.0" encoding="UTF-8"?> <application xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:application= "http://java.sun.com/xml/ns/javaee/application_5.xsd" xsi:schemaLocation= "http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd" id="Application_ID" version="5"> <module> <ejb>bank.jar</ejb> </module> </application> 32.5 application-client.xml beschreibt First Tier Client Program - Client Beschreibung Environment Entries EJB Referenzen Resource Referenzen Resource Environment Referenzen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 231 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren 32.6 jboss-client.xml bescheibt Informationen für den Application Server - Versionsnummern - JNDI-Mapping ► Name unter dem das Home-Interface gefunden wird - Resource Referenzen <jboss-client> <jndi-name>MoneyExchangeClient</jndi-name> <ejb-ref> <ejb-ref-name>ejb/MoneyExchange</ejb-ref-name> <jndi-name>moneyexchange</jndi-name> </ejb-ref> </jboss-client> 32.7 jbosscmp-jdbc.xml beschreibt O/R-Mapping für die Datenbank ► applikationsserverspezifisch - Datasource ► Information für den DB-Connect im Application Server - jndi-Name ► Name unter dem das Home-Interface gefunden wird <jbosscmp-jdbc> <defaults> <datasource>java:/DefaultDS</datasource> <datasource-mapping>MySQL</datasource-mapping> <create-table>true</create-table> <remove-table>true</remove-table> </defaults> <enterprise-beans> <entity> <ejb-name>Product</ejb-name> <table-name>ProductTable</table-name> </entity> </enterprise-beans> </jbosscmp-jdbc> © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 232 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Deployment Descriptoren S Trends Lerninhalte Agil Groovy DSL – Domain Specifi Languages NoSQL – Not Only SQL © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 233 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Programmierparadigma 33 Programmierparadigma Lat: <Paradigma Paradigma> Paradigma = begreiflich machen, (para = neben) und (digma = zeigen) wiki Ein Programmierparadigma ist das einer Programmiersprache oder Programmiertechnik zugrunde liegende Prinzip. Prinzip. (einige) bekannte (Programmier)-Paradigmen Struktur - Strukturiert (WIE) - Imperativ (lineare Folge von Befehlen) - Prozedural (in Teilaufgaben zerlegt) Deklaration - Modular (Module als logische Einheiten, Funktion und Daten) - Deklarativ (WAS) - Funktional (ergebnisorientiert) - Logisch (logikbasiert) Orientation - Orientiert (WOZU) - Objekt (Kommunikation, polymorph – mehrere Formen) - Komponenten (abstrakt) - Aspekt (orthogonal freie Kombinierbarkeit unabhängiger Konzepte) - Agil (DRY Don't Repeat Yourself) Agilität 33.1 Agiles Programmieren Lat: <agilis agilis> agilis = flink, beweglich (Agile Softwareentwicklung reduziert Aufwand und Regeln) Skript- vs. Programmiersprachen Skriptsprache Ziel Einsatz Ausführung Typisierung Typisierung Vorteile Kombination bestehender Bausteine (Shell-Skript), Bibliotheken (Perl, Python) spezifisch: GUI (JavaScript), Reporting (Perl) interpretiert oder Bytecode schwach, flexibel, dynamisch schnelle Entwicklung (Python), Prototypen (Shell-Skript), kleine Systeme (Perl) Programmiersprache Programmiersprache Neuentwicklungen (C, C++) allgemein kompilierter Maschinencode streng, flexibel effiziente Anbindung, Ausnutzung von Ressourcen (C++, Java) © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 234 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Programmierparadigma Historie der Skriptsprachen JCL 1963 (Job Control Language) AWK 1977 1977 (Aho Weinberger Kernighan) Sh 1978 1978 (Bourne Shell) Perl 1987 (Practical Extraction and Report Language) Tcl 1988 1988 Python 1990 1990 (Tool Command Language) (Monthy Python) PHP 1995 1995 Ruby 1995 1995 JavaScript 1995 1995 (Personal Home Page) (Eng: Rubin) (ECMA 262) Groovy 2003 (JSR 241) 33.2 Groovy wiki dynamisch typisierte ProgrammierProgrammier- und Skriptsprache für die Java VM verbindet JavaJava-Syntax mit den Konzepten von Ruby. Ruby. Groovy Groovy ermöglicht: - pragmatisches (selbsterklärend) extremes (code a little, test a little) agiles (YWGWYS) funktionales (funktionale Abhängigkeiten) objektorientiertes (alles sind Objekte) abstrahiertes (wieder verwendbarer Code) effizientes (weniger Codeumfang) einfaches (Syntax) Programmieren. Paradigmen objektorientiert, Skriptsprache, teilweise deklarativ Erscheinungsjahr 2003 Entwickler The Codehaus Aktuelle Version 1.7 (2010) Typisierung stark, statisch, dynamisch Betriebssystem plattformunabhängig Lizenz Open Source, Apache Software License 2.0 Groovy. Codehaus http://groovy.codehaus.org/ © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 235 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Programmierparadigma 33.3 DSL Domain Specific Language wiki Eine domänenspezifische Sprache (engl. domaindomain-specific specific language, language, DSL) ist eine formale Sprache, Sprache, die speziell für ein bestimmtes Problemfeld (die Domäne) Domäne) entworfen und implementiert wird. Beim Entwurf einer DSL wird man bemüht sein, einen hohen Grad an Problemspezifität zu erreichen: die Sprache soll alle Probleme Probleme der Domäne darstellen können und nichts darstellen können, was auss ausserhalb sserhalb der Domäne liegt. Dadurch ist sie durch Domänenspezialisten ohne besonderes Zusatzwissen bedienbar. Idee - weniger Redundanz HTTP - deklarative Beschreibung eines Sachverhaltes - bessere Lesbarkeit - weniger technischer Code - domänenspezifische, statische Validierung - leichte Erlernbarkeit, aufgrund des beschränkten Umfangs DSL 33.4 Domain DSL http Deamon SQL DBMS Domain NoSQL (Not only SQL) wiki NoSQL is a movement promoting a loosely defined class of nonnon-relational data stores stores that break with a long history of relational databases. These data stores may not require fixed table schemas, schemas, usually avoid join operations and typically scale horizontally. horizontally. im Web 2.0 (social Nertworking) sind schreibende Zugriffe wichtig (nicht nur lesende) - für Anwendungen, bei denen endgültige Konsistenz der Daten gewährleistet sein muss - Twitter - Facebook - traditionell: RDBMS - Constraints - Transaktionen - Locking - SQL - RDBMS haben Probleme mit der Verarbeitung und Skalierung grosser Datenmengen - neuer Ansatz - NoSQL z.B. "Key/Value" Storage © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 236 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Programmierparadigma T Projekt Lerninhalte Inhalt Umfang Voraussetzungen Hilfsmittel Aufträge Bewertung © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 237 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34 Kompetenznachweis Der Kompetenznachweis ist in drei Teile und als Praxis- und Theorie-Teil unterteilt: PRAXIS ERSTER TEIL Form Projekt als Einzelarbeit Hilfsmittel - THEORIE ZWEITER TEIL DRITTER TEIL Schriftliche Prüfung PC mit Internetzugang / JBoss / Eclipse Entwicklungsumgebung - schriftliche Unterlagen Dauer 16 Lektionen / 600 Minuten 2 Lektion / 100 Minuten Punkte 60 60 Wertung 50 % 50 % Vorgaben - Abgaben 34.1 - workflow-interceptor.jar (als EJB Interceptor) ch.zli.m223.interceptor.WorkflowInterceptor.class JBoss Applikationserver MySQL RDBMS JUnit Framework PDF Dokument: - Use-Case-Diagramm - Deployment-Diagramm - Klassen-Diagramm - Sequenz-Diagramm - JUnit-Testklasse - Source als Eclipse Projekt Email (generiert) - keine - schriftliche Modulprüfung ev. erstellte Zusatzblätter Gliederung Der Kompetenznachweis besteht aus Teilen und ist in Praxis- und Theorie-Teile untergliedert. Der erste Teil ist durch die Aufträge P1 – P5 detailliert beschrieben und wird als Einzelarbeit durch Analyse der praktischen Projektarbeit definiert. Der zweite Teil besteht aus der Umsetzung der Analyse in Programmcode und ist durch den Auftrag P6 beschrieben. Auch dieser Teil des Kompetenznachweises wird als Einzelarbeit ausgeführt. Der dritte Teil umfasst eine schriftliche Prüfung. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 238 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis ERSTER TEIL ZWEITER TEIL DRITTER TEIL Seite 2 10 8 1/3 % 3_1 11 P2 UML Deployment-Diagramm 2 10 8 1/3 % 3_2 12 P3 UML Klassen-Diagramm 2 10 8 1/3 % 3_3 13 P4 UML Sequenz-Diagramm 2 10 8 1/3 % 3_4 14 P5 TDD JUnit-Testklasse 2 10 8 1/3 % 3_5 15 P6 Implementation 6 3_6 16 T1 OOA 10 8 1/3 % 4 17 T2 OOD 10 8 1/3 % 4 17 T3 Container-Komponenten 10 8 1/3 % 4 17 T4 O/R Mapping 10 8 1/3 % 4 17 T5 Transaktionen 10 8 1/3 % 4 17 T6 Testkriterien 10 8 1/3 % 4 17 60 50 % Punkte Punkte 8 1/3 % 2 Total 34.1.1 10 18 50 37.5 % Wertung UML Use-Case-Diagramm Thema Wertung P1 Aufträge Aufgaben Kapitel schriftliche Prüf. Wertung Projekt als Einzelarbeit Punkte THEORIE Zeit in Lektionen PRAXIS 10 12.5 % Bewertung für die Bewertung des Kompetenznachweises gilt: - die Bewertung folgt der linearen Notenscala (Note = (Punkte x 5) / 120) + 1) - Note des Kompetenznachweises wird auf 0.5 gerundet - für die Note 4 sind 66 Punkte notwendig: ((66 x 5) / 120) + 1 = 3.75) Notenformel Punkte: x 5 + 1 120 = Notenscala 6 5 4 Note 3 2 1 0 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99 101 103 105 107 109 111 113 115 117 119 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 239 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.1.2 Bezug der Aufträge zu den Handlungszielen Die Projektarbeit (Praxis-Teil) deckt die Handlungsziele wie folgt ab: Handlungsziele HZ Beschreibung P1 P2 P3 P4 P5 P6 1 Benutzeranforderungen objektorientiert analysieren und Anforderungen an die Datenhaltung mit Struktur und Inhalt der relationalen Datenbank abgleichen und dokumentieren. 2 Last-, Durchsatz-, Verfügbarkeits- und Sicherheitsanforderungen aufgrund der Leistungsspezifikationen bestimmen. 3 Transaktionen Multi-User fähig entwerfen. User Interfaces und Datenbankanpassungen spezifizieren. 4 User Interfaces, Datenbankanpassungen und Transaktionen implementieren. 5 Testdrehbuch und Testfälle für funktionale und nicht-funktionale Anforderungen definieren. 6 Applikation testen und Testprotokoll erstellen. 7 Applikation dokumentieren und dabei auf Wartbarkeit und Nachvollziehbarkeit achten. 34.1.3 schriftliche Prüfung Die schriftliche Prüfung (Theorie-Teil) überprüft die zur Ausübung des praktischen Projektes notwendigen Technologien und steht daher nur indirekt in Bezug zu den Handlungszielen. - Die schriftliche Prüfung behandelt die folgenden Themenbereiche: OOA OOD ContainerContainerKomponenten O/R Mapping Transaktionen Testenkriterien © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 240 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.1.4 Ablauf Die Analyse (Erster Teil) besteht aus 5 Aufträgen. Dazu stehen 10 Lektionen zur Verfügung. Die fünf Aufträge werden als Einzelarbeit geplant, durchgeführt und dokumentiert. Die Dokumentation wird elektronisch und in Papierform am Ende der ersten Phase abgegeben. Die Implementation (Zweiter Teil) besteht aus 1 Auftrag. Die dazu zur Verfügung stehende Zeit sind 6 Lektionen. Dieser Auftrag wird als Einzelauftrag geplant und ausgeführt. Der ausgeführte Auftrag wird am Ende der Projektphase elektronisch abgegeben. Die Prüfung (Dritter Teil) besteht aus einer schriftliche Prüfung, die als Einzelarbeit gelöst werden muss. Es stehen dazu 2 Lektionen zur Verfügung. PRAXIS THEORIE Lektionen 10 Lektionen 6 Lektionen 2 Minuten 500 Minuten 300 Minuten 100 Lektionen Minuten Erster Teil Analyse lyse : P1, P2, P3, P4, P5 Ana - Use-Case-Diagramm - Deployment-Diagramm - Klassen-Diagramm - Sequenz-Diagramm - JUnit-Testklasse Zweiter Teil Implementation : P6 - Implementation Dritter Teil Prüfung Prüfu ng : T1 –T6 - schriftliche Prüfung Abgabe PDF Datei - Use-Case-Diagramm Deployment-Diagramm Klassen-Diagramm Sequenz-Diagramm JUnit-Testklasse Projekt - Source - Email Prüfung ► als Eclipse Projekt ► generiert © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 241 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.1.5 Abgaben Analyse ► Erster Teil Die Analyse zum Projektauftrag ist in einem Dokument festzuhalten. Dieses Dokument bildet die Basis für die Bewertung. Die inhaltlichen Voraussetzungen der Dokumentation, sowie die Bewertungsgrundlage dazu, sind in den Aufträgen P1, P2, P3, P4 und P5 detailliert. Die Dokumentation wird von jedem Teilnehmer als Einzelarbeit erstellt und am Schluss des ersten (Prüfungs-)teils in elektronischer (PDF Datei) und gedruckter Form (Drucker im Klassenzimmer) entsprechend den Anweisungen der Lehrperson abgegeben. Implementation ► Zweiter Teil Die Umsetzung als Programmcode wird in der zur Verfügung gestellten Eclipse Entwicklungsumgebung realisiert. Die Applikation muss auf den zur Verfügung gestellten JBoss Applikationsserver deployed werden. Persistente Domänenobjekte müssen durch das MySQL RDBMS abgebildet werden. Die Implementation wird von jedem Teilnehmer als Einzelarbeit erstellt und am Schluss des zweiten (Prüfungs-)teils in elektronischer Form (Eclipse Projekt) entsprechend den Anweisungen der Lehrperson abgegeben. Der zur Verfügung gestellte Interceptor (workflow-interceptor.jar) muss verwendet werden. Das dadurch (erfolgreich und korrekt) generierte Email ist Bestandteil der Bewertung. schriftliche Prüfung ► Dritter Teil Die schriftliche Prüfung wird am Anfang des dritten (Prüfungs-)teils ausgeteilt. Die Prüfung ist als Einzelarbeit zu lösen. Die Lösungen sind direkt auf der ausgeteilten Vorlage zu notieren. Persönliche, schriftliche Notizen und Schulungsunterlagen dürfen dabei verwendet werden. Die Prüfung ist am Ende des "Dritten Teils" abzugeben. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 242 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.2 Praxis-Teil 34.2.1 Ausgangslage Sie müssen die folgenden Technologien zur Lösung des Kompetenznachweis verwenden: JUNIT ► aktuelle Version 4.8 JUnit ist ein Framework zum Testen von Java-Programmen, das besonders für automatisierte Unit-Tests einzelner Units (meist Klassen oder Methoden) geeignet ist. EJB ►aktuelle Version 3.1 Enterprise JavaBeans (EJB) sind standardisierte Komponenten innerhalb eines Java-EEServers (Java Enterprise Edition). Sie vereinfachen die Entwicklung komplexer mehrschichtiger verteilter Softwaresysteme mittels Java. Mit Enterprise JavaBeans können wichtige Konzepte für Unternehmensanwendungen, z. B. Transaktions-, Namensoder Sicherheitsdienste umgesetzt werden, die für die Geschäftslogik einer Anwendung nötig sind. JPA ► aktuelle Version 2.0 Die Java Persistence API (auch JPA) ist eine Schnittstelle für Java-Anwendungen, die die Zuordnung und die Übertragung von Objekten zu Datenbankeinträgen vereinfacht. Sie vereinfacht die Lösung des Problems der objekt-relationalen Abbildung, das darin besteht, Laufzeit-Objekte einer Java-Anwendung über eine einzelne Sitzung hinaus zu speichern (Persistenz), wobei relationale Datenbanken eingesetzt werden können, die ursprünglich nicht für objektorientierte Datenstrukturen vorgesehen sind. Die Java Persistence API wurde als Projekt der JSR 220 Expert Group entwickelt und im Mai 2006 erstmals veröffentlicht. JAAS ► JSE Bestandteil seit J2SDK 1.4 Java Authentication and Authorization Service (JAAS) ist ein Java-API, das es ermöglicht, Dienste zur Authentifizierung und Zugriffsrechte in Java-Programmen bereitzustellen. JAAS orientiert sich an den Pluggable Authentication Modules (PAM) und unterstützt dadurch eine benutzerbasierte Autorisierung. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 243 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.2.2 Entwicklungsmethoden TDD ► Aspekt von Extreme Programming (XP (XP) XP) Testgetriebene Entwicklung (auch testgesteuerte Programmierung, engl. test first development oder test-driven development (TDD)) ist eine Methode, die häufig bei der agilen Entwicklung von Computerprogrammen eingesetzt wird. Bei der testgetriebenen Entwicklung erstellt der Programmierer Software-Tests konsequent vor den zu testenden Komponenten. Die dazu erstellten Unit-Tests sind Grey-Box-Tests statt klassischer White-Box-Tests. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 244 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.2.3 Architektur Basierend auf den definierten Technologien ist die folgende Architektur einer verteilten Multi-User Applikation zu spezifizieren, zu implementieren, zu testen und zu dokumentieren. - Client Tier - Implementation von TDD (Test Driven Development) JUnit Testcases - Logik TIER - EJBs als Session Facade / Domänenlogik - persistiert durch JPA - deployed auf JBoss Applikationsserver - Email generiert durch Interceptor ► Interceptor (workflow-interceptor.jar) wird zur Verfügung gestellt - EIS Tier - MySQL als RDBMS - persistiert Domänenobjekte - ekslox.edu.zli - Mail Server, empfängt durch Interceptor generierte Email - die Teilnehmer haben keinen Zugriff auf die generierten Email © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 245 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.2.4 Aufgabenstellung Basierend auf den definierten Technologien und der geforderten Architektur entwerfen die Teilnehmer Domänenobjekte einer verteilten Multi-User Applikation. Die Aufgabenstellung der Domänenobjekte können dabei frei gewählt werden. Folgende Bedingungen müssen dabei berücksichtigt werden. Session Fassade - durch ein EJB muss eine Session Fassade zu Domänenobjekten (@Entity) realisiert werden - die Session Fassade muss durch den WorkflowInterceptor abgefangen werden - der WorkflowInterceptor wird als (workflow-interceptor.jar) zur Verfügung gestellt SicherheitsSicherheits-Kontext - die Session Fassade der Domänenobjekte muss sich in einen Security Context (JAAS) befinden - der Name des Teilnehmers (Name_Vorname) muss als Prinzipal (User) definiert sein - der Name des Teilnehmers soll nach erfolgreicher Authentifizierung durch die Rolle "zli" autorisiert werden - den Realm (Files, DB, Ldap, etc.) kann frei gewählt werden TransaktionalerTransaktionaler-Kontext - die Session Fassade der Domänenobjekte muss sich in einen Transaction Context befinden - durch einen JUnit Testcase muss ein Rollback simuliert werden Email durch Interceptor - der WorkflowInterceptor generiert bei einem Client Request (@Test ► JUnit Testcase) ein Email und versendet dieses an ekslox.edu.zli wenn: - der Prinzipal durch die Rolle "zli" autorisiert ist der Transaktionale-Kontext durch einen Rollback beendet wird © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 246 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.3 Aufträge 34.3.1 P1 ► UML Use-Case-Diagramm Auftrag Erstellen Sie ein UML Use-Case-Diagramm der Aufgabestellung. Hinweis ► Denken Sie an den Anwendungsfall, Anwendungsfall, mit mit dem ein Rollback simuliert werden kann! Bewertungskriterien - 2 Punkte bei vollständigem und korrektem Resultat - 1 Punkt bei teilweisem oder fehlerhaftem Resultat - 0 Punkte bei keinem Resultat oder bei einem unbrauchbaren Ansatz Richtzeit - die Richtzeit für diesen Auftrag ist 2 Lektionen = 100 Minuten 1 2 3 4 5 Total Punkte Auftrag Bewertung in Punkten - achten Sie dabei auf die folgenden Bewertungskriterien Bewertung die Systemgrenze ist vorhanden und mit einen aussagekräftigen Namen (nicht System) benannt und wo notwendig zusätzlich beschrieben die Use Cases sind als messbarer Nutzen benannt (z.B. als verbNomen) und wo notwendig zusätzlich beschrieben der Actor mit der "zli" Autorisierung ist vorhanden und die entsprechende Authentifizierung ist vorhanden (z.B. durch Use Case "login") die Funktionalität des WorkflowInterceptor ist abgebildet (als Use Case) und die asynchrone Kommunikation zu ekslox.edu.zli (ausserhalb des Systems) ist ersichtlich das Use-Case-Diagramm folgt der grafischen UML Notation (Actor als Strichmännchen, Use Case als Eclipse, System als Rechteck, Beziehungen als Linien, etc.) 2 2 2 2 2 10 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 247 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.3.2 P2 ► UML Deployment-Diagramm Auftrag Erstellen Sie ein UML Deployment-Diagramm basierend auf der Aufgabestellung und dem erstellten Use-Case-Diagramm (P1). Bewertungskriterien - 2 Punkte bei vollständigem und korrektem Resultat - 1 Punkt bei teilweisem oder fehlerhaftem Resultat - 0 Punkte bei keinem Resultat oder bei einem unbrauchbaren Ansatz Richtzeit - die Richtzeit für diesen Auftrag ist 2 Lektionen = 100 Minuten 1 2 3 4 5 Total Punkte Auftrag Bewertung in Punkten - achten Sie dabei auf die folgenden Bewertungskriterien Bewertung die einzelnen Tiers (Client / Test, Logik, EIS, etc.) sind vorhanden und beschrieben (Implementierungen, Technologien, Versionen, etc.) die Komponenten sind vollständig vorhanden, korrekt untereinander verbunden und korrekt beschrieben (Namen, Technologien, etc.) die verwendeten Dienstleistungen (Services) sind korrekt gezeichnet und beschrieben (JNDI, JAAS, JPA, JMS, JDBC etc.) die Tiers sind korrekt verbunden und die verwendeten Protokolle (RMI-IIOP, HTTP, SMTP, etc.) sowie die Unterscheidung der synchronen / asynchronen Kommunikation sind ersichtlich das Deployment-Diagramm folgt der grafischen UML Notation (Tier als (3D-) Rechteck, Komponente als (Fahnen-) Rechteck, Service als Kreis, Beziehung als Linie, etc.) 2 2 2 2 2 10 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 248 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.3.3 P3 ► Klassen-Diagramm Auftrag Erstellen Sie ein UML Klassen-Diagramm basierend auf der Aufgabestellung und dem erstellten Use-Case-Diagramm (P1) und dem erstellten Deployment-Diagramm (P2). Bewertungskriterien - 2 Punkte bei vollständigem und korrektem Resultat - 1 Punkt bei teilweisem oder fehlerhaftem Resultat - 0 Punkte bei keinem Resultat oder bei einem unbrauchbaren Ansatz Richtzeit - die Richtzeit für diesen Auftrag ist 2 Lektionen = 100 Minuten 1 2 3 4 5 Total Punkte Auftrag Bewertung in Punkten - achten Sie dabei auf die folgenden Bewertungskriterien Bewertung Bewertung die einzelnen Klassen (EJBs, Interfaces, Pojos, etc.) sind vollständig vorhanden und korrekt beschrieben (Stereotyp, Namen, Attribute, Methoden, etc.) die Attribute sind vollständig vorhanden (SessionContex, EntityManager, Pojo Eigenschaften, etc.) und korrekt beschrieben (Namen, Typ, Sichtbarkeit, etc.) die Methoden sind vollständig und korrekt vorhanden (Namen, Signature, Sichtbarkeit, etc.); dabei dürfen die Getter/Setter Methoden als "getter/setter" markiert sein der Zusammenhang zwischen den einzelnen Klassen ist korrekt und beschreiben die Art der Beziehung (Polymorphie, Kardinalität, Kommunikationsmodell, etc.) ist ersichtlich das Klassen-Diagramm folgt der grafischen UML Notation (Rechteck mit Unterteilungen, Sichtbarkeiten, Pascal Notation, etc.) 2 2 2 2 2 10 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 249 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.3.4 P4 ► Sequenz-Diagramm Auftrag Erstellen Sie ein UML Sequenz-Diagramm basierend auf der Aufgabestellung und dem erstellten Use-Case-Diagramm (P1), dem erstellten Deployment-Diagramm (P2) und dem erstellten Klassen-Diagramm (P3). Beschreiben Sie als Sequenz den simulierten Vorgang, der den transaktionalen Kontext durch einen Rollback beendet. Beschreiben Sie, wieso ein Rollback stattfindet. Ergänzen Sie die Methodenaufrufe durch nachvollziehbare und konkrete Informationen, z.B: - Interaktion ► void transferAmount(from:Account, to: Account, amount: Amount) ergänzt mit ► void transferAmount("Sparkonto", "Kontokorrent", new (100.00, "EUR")) Bewertungskriterien - 2 Punkte bei vollständigem und korrektem Resultat - 1 Punkt bei teilweisem oder fehlerhaftem Resultat - 0 Punkte bei keinem Resultat oder bei einem unbrauchbaren Ansatz Richtzeit - die Richtzeit für diesen Auftrag ist 2 Lektionen = 100 Minuten 1 2 3 4 5 Total Punkte Auftrag Bewertung in Punkten - achten Sie dabei auf die folgenden Bewertungskriterien Bewertung alle notwendigen Objekte sind vorhanden korrekt beschrieben (Klassennamen), und in einer sinnvollen Reihenfolge (Reihenfolge der Aufrufe, Trennung der Schichten, etc.) die Interaktion zwischen den Objekten ist vollständig vorhanden (Client Tier, Logik Tier, etc.) und korrekt beschrieben (Methodennamen, korrekte Signature, etc.) die Informationen, die einen Rollback simulieren, sind vorhanden und korrekt beschrieben (z.B. void transferAmount("Sparkonto", "Kontokorrent", new (100.00, "EUR")) die Abgrenzung des transaktionalen Kontext ist ersichtlich (Objekte innerhalb, bez. ausserhalb des transaktionalen Kontext), der Rollback findet statt und ist durch eine Beschreibung erklärt das Sequenz-Diagramm folgt der grafischen UML Notation (Objekte in x-Achse, Zeit in yAchse, ObjectLyfeCycle duch X beendet, Interaktion zwischen Objekten als Linie, etc.) 2 2 2 2 2 10 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 250 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.3.5 P5 ► TDD JUnit-Testklasse Auftrag Erstellen Sie eine Testklasse nach dem Ansatz des TDD (Test-Driven-Development). Fokussieren Sie sich auf den Testcase (@Test), der den transaktionalen Kontext der Session Fassade mit einem Rollback beendet. Stellen Sie die Ressourcen zum Test durch Initialisierungsmethoden (@Before) zur Verfügen und räumen Sie diese Ressourcen nach Beendigung des Tests wieder auf (@After). Bewertungskriterien - 2 Punkte bei vollständigem und korrektem Resultat - 1 Punkt bei teilweisem oder fehlerhaftem Resultat - 0 Punkte bei keinem Resultat oder bei einem unbrauchbaren Ansatz Richtzeit - die Richtzeit für diesen Auftrag ist 2 Lektionen = 100 Minuten 1 2 3 4 5 Total Punkte Auftrag Bewertung in Punkten - achten Sie dabei auf die folgenden Bewertungskriterien Bewertung die Testklasse beschreibt den Testcase (z.B. @Test) zur Simulation eines Rollback (korrespondiert mit UML Diagrammen) die Testklasse definiert die notwendigen Ressourcen (z.B. Datensätze in DB speichern, etc.) durch eine Initialisierung (z.B. @Before) die Testklasse räumt die notwendigen Ressourcen (z.B. Datensätze aus DB löschen, etc.) wieder auf (z.B. @After) der Testcase (z.B. @Test) initialisiert die notwendigen Objekte (Session Faccade, etc.), führt die notwendige Interaktion durch (korrekte Methoden, etc.) und behauptet (Asserts, etc.) relevant die Testklasse ist wartbar (z.B. Typen, Eingaben, Ausgaben, etc.) und nachvollziehbar (z.B. Funktionsbeschreibung, Ablaufbeschreibug, etc.) dokumentiert 2 2 2 2 2 10 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 251 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.3.6 P 6 ► Implementation Auftrag Implementieren Sie Ihre durch UML und TDD definierte Applikation mit Eclipse und deployen Sie diese auf dem JBoss Applikationsserver. Arbeiten Sie in Ihrem Benutzerprofil und nicht als lokaler Administrator. Verwenden Sie den zur Verfügung gestellten Interceptor um das notwendige Email zu generieren/versenden: - workflow-interceptor.jar (ch.zli.m223.interceptor.WorkflowInterceptor.class) - als Interceptor der EJB Session Fassade Bewertungskriterien: - 2 Punkte bei vollständigem und korrektem Resultat - 1 Punkt bei teilweisem oder fehlerhaftem Resultat - 0 Punkte bei keinem Resultat oder bei einem unbrauchbaren Ansatz Richtzeit: - die Richtzeit für diesen Auftrag ist 6 Lektionen = 300 Minuten Auftrag Bewertung Punkte Bewertung in Punkten - achten Sie dabei auf die folgenden Bewertungskriterien 1 Email ist auf ekslox.edu.zli eingegangen 2 2 Inhalt der Email: der Teilnehmer arbeit mit seinem Userprofil (nicht als Administrator) 2 3 Inhalt der Email: der Prinzipal definiert sich aus Name_Vorname des Teilnehmers 2 4 Inhalt der Email: die Interaktion entspricht der UML Definition (Methodennamen, Signature, etc.) 2 5 Inhalt der Email: die Interaktion simuliert einen Rollback (durch realistische Parameter) 2 Total 10 Hinweis ►D Die Email wird durch den WorkflowInterceptor automatisch generiert und an ekslox.edu.zli versendet wenn die Interaktion mit der Session Fassade (Domänenobjekte) in einem SecuritySecurity-Kontext stattfindet; der Prinzipal durch die Rolle "zli" autorisiert ist und und der transaktionale Kontext durch einen Rollback beendet wird. © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 252 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis 34.4 Theorie-Teil 34.4.1 schriftliche Prüfung Die schriftliche Prüfung ist Bestandteil des Kompetenznachweis und behandelt die folgenden Themenbereiche, die auf den Umfang einer verteilten und objektorientierten Multi-User Applikation reduziert sind: - OOA Objekt-Orientierte-Architektur OOD Objekt-Orientiertes-Design Container-Komponenten O/R Mapping Transaktionen Testkriterien Richtzeit: - die Richtzeit für die schriftliche Prüfung sind 2 Lektionen = 100 Minuten Bewertung in Punkten - Jeder Themenbereich setzt sich aus vier Einzelaufgaben zusammen Inhalt Punkte diese sind wie folgt gegliedert: Teilaufgabe - 1 einfacher Multiple-Choice 1 2 schwieriger Multiple-Choice 2 3 4 Total einfache Wissensfrage, wobei die Antwort bildlich, textlich oder als Source verlangt werden kann schwierige Wissensfrage, wobei die Antwort bildlich, textlich oder als Source verlangt werden kann 3 4 10 © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 253 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Kompetenznachweis U Referenzen Lerninhalte Bücher Referenzen © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 254 >> total: 255 Seiten EJB 3.1 / JPA 2.0 >> Java Framework >> Anhang 35 Anhang - Bücher - Online Referenzen Bücher ISBN 987987-3-8986489864-431431-0 978978-3-8680286802-014014-4 3-82738273-21842184-0 0-1313-142246142246-4 3-82738273-21242124-7 3-82738273-18621862-9 0-76457645-76827682-8 9-780321780321-118899 1-932394932394-8888-5 0-1313-140264140264-1 Titel EJB 3 professionell JPA mit Hibernate J2EE, Einstieg für Anspruchsvolle Core J2EE Patterns, Best Practices and Design Strategies J2EE Patterns, Entwurfsmuster für die J2EE Entwurfsmuster, Elemente wiederverwendbarer objektorientierter Software Mastering Enterprise JavaBeans Enterprise Java Security Java Persistence with Hibernate J2EE Security Online Referenzen URL http://www.java.com http://www.java.com http://www.jboss.org http://www.hibernate.org http://www.ejbkomplett.net http://geekandpoke.typepad.com/ Inhalt Java JBoss Hibernate EJB geek & poke © 2010 / 2011 >> Version 4.1 >> Stephan Metzler >> Seite 255 >> total: 255 Seiten