Datenzugriffskomponenten mit JPA



Ähnliche Dokumente
Übungsaufgabe Transaktion als Middleware

Softwareentwicklung mit Enterprise JAVA Beans

Datenzugriffskomponente mit JPA 2.1

SQL für Trolle. mag.e. Dienstag, Qt-Seminar

Java Persistence API 2.x. crud + relationships + jp-ql

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

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

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


ORM & OLAP. Object-oriented Enterprise Application Programming Model for In-Memory Databases. Sebastian Oergel

desk.modul : WaWi- Export

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Gregor Raschke 2008 HIBERNATE. Eine Einführung

Oracle: Abstrakte Datentypen:

Java Persistence API. Phillip Ghadir Oliver Tigges

JDBC. Es kann z.b. eine ODBC-Treiberverbindung eingerichtet werden, damit das JAVA-Programm auf eine ACCESS-DB zugreifen kann.

Informatik 12 Datenbanken SQL-Einführung

Dynamisches SQL. Folien zum Datenbankpraktikum Wintersemester 2009/10 LMU München

Einführung in die Programmierung

Datenmanagement in Android-Apps. 16. Mai 2013

DATENBANKEN SQL UND SQLITE VON MELANIE SCHLIEBENER

Mengenvergleiche: Alle Konten außer das, mit dem größten Saldo.

5. Programmierschnittstellen für XML

Prof. Dr. Uwe Schmidt. 21. August Aufgaben zur Klausur Objektorientierte Programmierung im SS 2007 (IA 252)

Database Exchange Manager. Infinqa IT Solutions GmbH, Berlin Stralauer Allee Berlin Tel.:+49(0) Fax.:+49(0)

Nachtrag: Farben. Farbblindheit. (Light und Bartlein 2004)

Referent: Marko Modsching. Vortrag: JPA mit Hibernate. Datum: Deutsche Software Engineering & Research GmbH

3. Stored Procedures und PL/SQL

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

5. Programmierschnittstellen für XML

mywms Vorlage Seite 1/5 mywms Datenhaltung von Haug Bürger

Whitepaper. Produkt: combit Relationship Manager. Datensatzhistorie mit dem SQL Server 2000 und combit GmbH Untere Laube Konstanz

Verhindert, dass eine Methode überschrieben wird. public final int holekontostand() {...} public final class Girokonto extends Konto {...

Applet Firewall und Freigabe der Objekte

SQL. strukturierte Datenbankabfragesprache eine Datenbanksprache zur. Structured Query Language:

seit Java 1.1 Bestandteil der API: packages java.sql, javax.sql

Prozedurale Datenbank- Anwendungsprogrammierung

Referenzielle Integrität SQL

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

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

JDBC. Allgemeines ODBC. java.sql. Beispiele

Programmieren in Java

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

Hibernate Das Praxisbuch für Entwickler

Architektur des agimatec-validation Frameworks

SQLJ. Standardisierte Java-DB. DB-Schnittstelle. Spezifikationen. Oracle, IBM, Informix, Sybase,, Tandem, Sun, Microsoft stehen dahinter

Hibernate. Vortragender : Nabil Janah Kursleiter : Prof. Dr. Björn Dreher Lehrveranstaltung : Komponenten-Architekturen. Nabil janah 1 Hibernate

SQL Tutorial. SQL - Tutorial SS 06. Hubert Baumgartner. INSO - Industrial Software

Suche schlecht beschriftete Bilder mit Eigenen Abfragen

Kurzanleitung für Umsteiger von DataEase.

Factory Method (Virtual Constructor)

Interaktive Webseiten mit PHP und MySQL

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

Eclipse und EclipseLink

Persistenz von Objekten relationale Datenbank Eigene Datenstruktur XML (JAXB) Proprietäre Dateiformate (Lochkarten)

Dieses Tutorial gibt eine Übersicht der Form Klassen von Struts, welche Besonderheiten und Unterschiede diese aufweisen.

2. Datenbank-Programmierung

Java Einführung Abstrakte Klassen und Interfaces

TU München, Fakultät für Informatik Lehrstuhl III: Datenbanksysteme Prof. Alfons Kemper, Ph.D.

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel

Java Einführung Collections

Einführung in SQL. Sprachumfang: Indizes. Datensätzen. Zugriffsrechten

3 Richtlinienbasierte Verwaltung und Multi-Server- Administration

Dokumentation zur Anlage eines JDBC Senders

Java Database Connectivity (JDBC) Walther Rathenau Gewerbeschule 1

Objektorientierte Programmierung. Kapitel 12: Interfaces

Upgrade-Leitfaden. Apparo Fast Edit 1 / 7

Programmieren für mobile Endgeräte SS 2013/2014. Dozenten: Patrick Förster, Michael Hasseler

Architekturen. Von der DB basierten zur Multi-Tier Anwendung. DB/CRM (C) J.M.Joller

SQL: statische Integrität

Zugriff auf Firebird-Datenbanken mit PHP. Daniel de West DB-Campus-Treffen 15. Januar 2004

Der lokale und verteilte Fall

White Paper. Konfiguration und Verwendung des Auditlogs Winter Release

Die Programmiersprache Java. Dr. Wolfgang Süß Thorsten Schlachter

Datenbanken SQL Einführung Datenbank in MySQL einrichten mit PhpMyAdmin

Aufbau des SELECT-Befehls. Im Folgenden werden zunächst Abfragen aus einer Tabelle vorgenommen.

Technische Beschreibung: EPOD Server

Institut für Programmierung und Reaktive Systeme 25. August Programmier-Labor Übungsblatt. int binarysearch(int[] a, int x),

Prinzipien Objektorientierter Programmierung

105.3 SQL-Datenverwaltung

7. Übung - Datenbanken

Objektorientierte Programmierung

Sichtbarkeit & statische Methoden. Einsatz von Sichtbarkeit Einsatz statischer Methoden programmatische Realisierung 2 Beispielaufgaben

WPF Steuerelemente Listbox, ComboBox, ListView,

Vererbung & Schnittstellen in C#

Verbinden von IBM Informix mit Openoffice mittels JDBC

Carl-Engler-Schule Karlsruhe Datenbank 1 (5)

5.2 Neue Projekte erstellen

Datenbanken & Informationssysteme Übungen Teil 1

Erstellung eines Frameworks für Shop Systeme im Internet auf Basis von Java

Objektorientierte Programmierung

Gesicherte Prozeduren

Verteidigung gegen SQL Injection Attacks

Oliver Paulus, 7. Februar Spring Framework Einführung. Oliver Paulus, Was ist Spring?

Transkript:

Datenzugriffskomponenten mit JPA FWP Aktuelle Technologien zur Entwicklung verteilter Java-Anwendungen Theis Michael - Senior Developer UniCredit Global Information Services S.C.p.A Sommersemester 2012

2

Java Persistence Architecture Persistence Context (runtime) Entity persist Entity flush Datastore Entity Entity find Entity merge Entity flush remove Entity flush Entity Manager Persistence Unit (configuration) Entity Classes Data Source 4

Entitäten Entitäten (ehemals Entity Beans) sind POJOs: Entitäten müssen keine EJB-Interfaces mehr implementieren Es müssen keine Deployment-Deskriptoren mehr erstellt werden (mit ( persistence.xml Ausnahme des Persistence Unit Descriptors Mit der Annotation @Entity wird ein beliebiges POJO als Entity Bean gekennzeichnet. Verwaltete und nicht-verwaltete Entitäten Verwaltete Entitäten (managed/attached) werden von einem EntityManager überwacht, der automatisch Änderungen erkennt und diese mit dem zugrundeliegenden Datenspeicher synchronisiert. Nicht verwaltete Entitäten (unmanaged/detached) werden von keinem Entity Manager überwacht und Änderungen daher auch nicht abgespeichert. 5

Persistence Context Umfasst alle zu einem bestimmten Zeitpunkt verwalteten Entitäten, die über in einem bestimmten Datenspeicher abgelegt sind => dynamische Zuordnung und Synchronisierung von Java-Objekten und einem Datenspeicher zur Laufzeit Persistenz-Kontexte werden von Entity-Managern verwaltet. Der Entity Manager erkennt alle Änderungen an Entities sowie Zugänge und Abgänge von Entities und synchronisiert diese mit dem zugrundeliegenden Datenspeicher. 2 unterschiedliche Arten von Persistenz-Kontexten: Transaktionsgebundene Persistenz-Kontexte (transaction-scoped) leben nur für die Dauer einer Transaktion. Erweiterte Persistenz-Kontexte (extended) überdauern eine Transaktion und die darin enthaltenen Entitäten werden weiterhin verwaltet. 6

Entity Manager Entitäten werden von Entity Managern in einem Persistenz-Kontext verwaltet. Entity Manager bieten die Methoden zur Manipulation von Persistenz-Kontexten. 2 unterschiedliche Arten von Entity Managern: Container-managed Entity Manager werden automatisch vom EJB-Container an alle Applikationskomponenten propagiert (über Dependency Injection), die innerhalb einer Transaktion einen Entity Manager benötigen. @PersistenceContext EntityManager em; Application-managed Entity Manager werden über die Applikationskomponenten selber erzeugt; mit jedem Entity Manager wird ein neuer lokaler Persitenz-Kontext erzeugt. @PersistenceUnit EntityManagerFactory emf; EntityManager em = emf.createentitymanager(); 7

Persistence Units Persistence Units definieren alle von Entity Managern verwalteten Entitäten-Klassen einer Applikation, die in dem gleichen Datenspeicher abgelegt werden sollen => statische Zuordnung von Java-Typen zu einem Datenspeicher Alle Entitäten-Klassen in einer Persistence Unit werden im gleichen Datenspeicher (über die gleiche DataSource) abgespeichert. Persistence Units werden im Form einer XML-Datei namens persistence.xml definiert (DD der Persistence Unit). Mehrere Persistence Units können über ihren Namen unterschieden werden. 8

Datenquellen und Verbindungen Interface javax.sql.datasource aus der JDBC API repräsentiert eine abstrakte Factory für Verbindungen zu einem relationalen Datenbanksystem Interface javax.sql.connection repräsentiert eine Verbindung zu einer bestimmten Datenbank SQL Anweisungen werden im Kontext einer Connection ausgeführt DataSources werden üblicherweise als Ressourcen in einem Applikationsserver konfiguriert, die über JNDI-Lookup ermittelt werden können Konkrete Implementierungen von DataSource werden von den Herstellern datenbank-spezifischer JDBC-Treiber zur Verfügung gestellt 9

Object Relational Mapping Entitäten sind POJOs POJO + Annotation @Entity + Persistence Unit = Entität Alternativ: POJO + orm.xml (XML Mapping) + Persistence Unit = Entität Abbildung von Klassen und Felder auf Tabellen und Spalten Mit der Annotation @Table werden Klassen auf Tabellen gemappt. Mit der Annotation @Column werden Felder auf Spalten gemappt. @Entity @Table(name = "T_ORDER") public class Order implements Serializable { private long id; @Id @Column(name="ORDER_ID ) public long getid() { return this.id; } public void setid(long id) { this.id = id; } } 10

Identität und Primarschlüssel Jede Entität muss analog dem Primärschlüssel einer Tabelle eine Identität besitzen Abbildung eines Feldes auf einen einspaltigen Primarschlüssel Annotation @Id markiert ein Feld einer Entität als Primarschlüssel. Über die Annotation @GeneratedValue ist die automatische Generierung der Primärschlüssel nach verschiedenen Strategien möglich Beispiel für einen über eine SEQUENCE generierten Primärschlüssel @Entity @Table(name="T_ORDER) @SequenceGenerator(name="ISHOP_SEQUENCE", sequencename="seq_ishop") public class Order { @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="ishop_sequence") public int getid() {...} 11

Komplexe Primarschlüssel Abbildung mehrerer Felder auf einen mehrspaltigen Primarschlüssel Entweder über @IdClass/@Id oder @EmbeddedId/@Embeddable oder @EmbeddedId/@AttributeOverride(s) lassen sich mehrere Felder mehreren Spalten eines zusammengesetzten Primärschlüssels zuordnen. 12

Beziehungen 7 unterschiedliche Beziehungen zwischen Entitäten sind möglich: ( unidirectional 1-zu-1 unidirektional (one-to-one ( bidirectional 1-zu-1 bidirektional (one-to-one ( unidirectional 1-zu-n unidirektional (one-to-many ( bidirectional 1-zu-n bidirektional (one-to-many ( unidirectional n-zu-1 unidirektional (many-to-one ( unidirectional m-zu-n unidirektional (many-to-many ( bidirectional m-zu-n bidirektional (many-to-many 13

Beziehungen Beispiel für eine bidirektionale 1-zu-n Beziehungen Eine Bestellung besteht aus mehreren Einzelposten @Entity public class Order { @OneToMany(cascade=CascadeType.ALL, fetch=fetchtype.eager, mappedby="order") public Collection<OrderItem> getorderitems() {... } } @Entity public class OrderItem { @ManyToOne @JoinColumn(name="ORDER_ID") public Order getorder() {... } } 14

Lebenszyklus von Entitäten Zustände von Entitäten new: Neue Entitäten haben keine persistente Identität und sind noch nicht mit einem Persistence Context verknüpft. managed: Verwaltete Entitäten haben eine persistente Identität und sind mit einem Persistence Context verknüpft. detached: Losgelöste Entitäten haben eine persistente Identität, sind aber nicht mit einem Persistence Context verknüpft. removed: Entfernte Entitäten haben eine persistente Identität, sind mit einem Persistence Context verknüpft und sind für die Löschung aus dem Datenspeicher vorgemerkt. 15

Lebenszyklus von Entitäten Zustände von Entitäten new: Neue Entitäten haben keine persistente Identität und sind noch nicht mit einem Persistence Context verknüpft. managed: Verwaltete Entitäten haben eine persistente Identität und sind mit einem Persistence Context verknüpft. detached: Losgelöste Entitäten haben eine persistente Identität, sind aber nicht mit einem Persistence Context verknüpft. removed: Entfernte Entitäten haben eine persistente Identität, sind mit einem Persistence Context verknüpft und sind für die Löschung aus dem Datenspeicher vorgemerkt. 16

Neue Entitäten speichern ( new->managed ) Erzeugen von neuen Entitäten Neue Instanzen von Entity Beans werden einfach über den new-operator erzeugt und über EntityManager.persist() abgespeichert. Order order = new Order(); this.repository.addorder(order); @PersistenceContext EntityManager entitymanager; public Order addorder(order order) { this.entitymanager.persist(order); // add to persistence context this.entitymanager.flush(); // synchronize persistence context -> DB this.entitymanager.refresh(); // synchronize DB -> persistence context return order; } Persistence Context (runtime) Entity Entity (1) new (2) persist (3) flush/commit Entity 17

Gespeicherte Entitäten lesen Lesen von Entitäten Bestehende Instanzen können über ihrem Primary Key mit EntityManager.find oder EntityManager.getReference gelesen werden Order order = em.find(order.class, orderid); @PersistenceContext EntityManager entitymanager; public Order getorderbyid(long orderid) { return this.entitymanager.find(orderid, Order.class); } ( Queries Komplexere Abfragen sind mit über Queries möglich (siehe Persistence Context (runtime) Entity (1) find/query Entity 18

Entitäten löschen ( managed->removed ) Löschen von Entitäten Bestehende Entity Beans werden mit EntityManager.remove zur Löschung vorgemerkt und mit dem Abschluss der aktuellen Transaktion tatsächlich aus dem @PersistenceContext EntityManager entitymanager; public void removeorder(order order) { Order merged = this.entitymanager.merge(order); this.entitymanager.remove(merged); } public void removeorderbyid(long orderid) { Order order = this.entitymanager.getreference(orderid, Order.class); this.entitymanager.remove(order); } Persistence Context (runtime) Entity (2) flush/commit Entity (1) remove 19

Entitäten ändern Ändern von Entitäten Änderungen an verwalteten Entity Beans werden automatisch vom EntityManager erkannt und bei Abschluss der aktuellen Transaktion in den Datenspeicher geschrieben. Die am Ende einer Transaktion oder nach EntityManager.flush geschriebenen Änderungen im Datenspeicher werden nicht automatisch in den verwalteten Entitäten nachgezogen. Hierfür muss EntityManager.refresh aufgerufen werden. Persistence Context (runtime) Entity (2) flush/commit Entity (1) modify 20

Losgelöste Entitäten ( detached Loslösen von Entitäten (managed -> Commit oder Rollback der aktuellen Transaktion, das Zurücksetzen des Persistence Contexts, das Schließen eines EntityManagers, Serialisierung über eine Remote-Schnittstelle führt zu einer Loslösung einer Entität vom Persistence Context. Das Abspeichern von Änderungen ist nicht mehr gewährleistet ( managed Synchronisierung von losgelösten Entitäten (detached -> Losgelöste Entity Beans müssen erst wieder mit EntityManager.merge mit einem Persistence Context verknüpft werden. Persistence Context (runtime) Entity (1) commit / rollback / serialize Entity (2) merge 21

Queries Queries werden durch das Interface javax.persistence.query repräsentiert JPA unterstützt zwei Abfragesprachen Java Persistence Query Language (JPA QL): portable objekt-orientierte Abfragesprache eng angelehnt an SQL Standard Query Language (SQL): standardisierte Abfragesprache der darunterliegenden relationalen Datenbank, häufig mit spezifischen Erweiterungen Queries werden über den EntityManager erzeugt und liefern bei Ausführung die Ergebnisse als typisierte Liste zurück Neben gewöhnlichen Abfragen können über Queries auch sog. Bulk- Updates und Deletes ausgeführt werden 22

Dynamische Queries Queries können über EntityManager.createQuery mit einem JPAQL SELECT Statement erzeugt werden Da so erzeugte Queries JPA erst zur Laufzeit bekannt gemacht werden, werden solche Queries als dynamische Queries bezeichnet @PersistenceContext EntityManager entitymanager;... public List<Order> findallordersofcustomer(string customerid) { TypedQuery<Order> query = this.entitymanager.createquery( "SELECT o FROM Order o WHERE o.customerid = :customerid, Order.class ); query.setparameter( "customerid", customerid ); return query.getresultlist(); } 23

Named Queries Queries können über @NamedQueries zur Kompilezeit an Entityklassen gebunden werden @NamedQuery verknüpft ein Querystatement mit einem eindeutigen Namen Diese vordefinierten Queries werden named queries genannt da sie nur über ihren Namen erzeugt werden können @NamedQuery( "findallordersofcustomer", "SELECT o FROM Order o WHERE o.customerid = :customerid" ) @Entity public class Order {... } @PersistenceContext EntityManager entitymanager;... public List<Order> findallordersofcustomer(string customerid) { TypedQuery<Order> query = this.entitymanager.createnamedquery( "findallordersofcustomer, Order.class); query.setparameter( "customerid", customerid ); return query.getresultlist(); } 24

Abfragesprache JPA QL Deklarative Abfragesprache mit großer Ähnlichkeit zu SQL Eher auf die Arbeit Java-Objekten als die Arbeit mit relationalen Datenschemata zugeschnitten Leicht zu lernen und präzise genug, um in nativen Datenbankcode übersetzt werden zu können JPA QL ist hersteller-unabhängig und portabel die Übersetzung von JPA QL in einen hersteller-spezifischen SQL-Code wird von JPA beim Ausführen einer Query übernommen Manchmal ist JPA QL nicht ausreichend Stored Procedures können nur über natives SQL ausgeführt werden JPA bietet die volle Unterstützung von nativem SQL über native Queries 25

JPA QL ist eine mächtige Sprache 26 ABS ALL AND ANY AS ASC AVG BETWEEN BIT_LENGTH BOTH BY CASE CHAR_LENGTH CHARACTER_ LENGTH CLASS COALESCE CONCAT COUNT CURRENT_DATE CURRENT_ TIMESTAMP DELETE DESC DISTINCT ELSE EMPTY END ENTRY ESCAPE EXISTS FALSE FETCH FROM GROUP HAVING IN INDEX INNER IS JOIN KEY LEADING LEFT LENGTH LIKE LOCATE LOWER MAX MEMBER MIN MOD NEW NOT NULL NULLIF OBJECT OF OR ORDER OUTER POSITION SELECT SET SIZE SOME SQRT SUBSTRING SUM THEN TRAILING TRIM TRUE TYPE UNKNOWN UPDATE UPPER VALUE WHEN WHERE

Einfache Queries (Beispiele) Parameterlose Query, die eine Liste von Entitäten zurückliefert public List<Course> getcourses() { TypedQuery<Course> coursesquery = this.entitymanager.createquery( "SELECT c FROM Course c ORDER BY c.name", Course.class); return coursesquery.getresultlist(); } Query mit Parameter, die eine einzelne Entität zurückliefert public User getuserbyname(string username) { TypedQuery<User> userbynamequery = this.entitymanager.createquery( "SELECT u FROM User u WHERE u.username = :username", User.class); userbynamequery.setparameter("username", username); User result = null; try { result = userbynamequery.getsingleresult(); } catch (NoResultException ex) { // it's OK when there is no user with the specified name, // so we simply swallow this exception and return null } return result; } 27

Blättern durch große Datenmengen Große Ergebnismengen können in logische Seiten unterteilt werden Indem man die Anzahl der Entitäten pro Seite festlegt durch Query.setMaxResults Und die Position der Seite innerhalb der gesamten Ergebnismenge bestimmt durch Query.setFirstResult public List<Service> getallservices(int firstposition, int pagesize) { TypedQuery<Service> query = this.entitymanager.createquery( "SELECT s FROM Service AS s, Service.class); query.setfirstresult(firstposition); query.setmaxresults(pagesize); return query.getresultlist(); } 28

Repositories und Adapter Datenorientiere Zugriffskomponenten werden im allgemeinen als Repository bezeichnet, service- oder logik-orientierte eher als Adapter In JavaEE ab Version 5 erfolgt der Zugriff auf relationale Datenbanken standardkonform über JPA Am einfachsten werden Datenzugriffskomponenten als Stateless Session Beans implementiert @Stateless public class TaskRepositoryBean { @PersistenceContext private EntityManager entitymanager; public Task addtask(task task) { } public Task gettaskbyid(long taskid) { } public Task settask(task task) { } public Task removetask(task task) { } public List<Task> gettasks(int firstposition, int pagesize) { }

Generische Repositories Motivation: Die Schnittstellen und Implementierungen der meisten Repositories unterscheiden sich nur im zugrundeliegenden Entitätentyp => Widerspruch zum DRY-Prinzip! Lösung: Ein generisches Repository bündelt die für alle Typen gleiche CRUD- Funktionalität in einer generischen abstrakten Basisklasse Typ der Entitätenklasse und deren Primärschlüsselklasse bilden die Typparameter der generischen Basisklasse. Die typspezifischen Queries werden als Named Queries an den Entitätentypen gebunden und der Name der zu verwendenden Query als Parameter übergeben. Queryparameter werden als Map<String, Object> oder als List<QueryParameter> übergeben.

Generische Repositories im Vergleich Herkömmliche Lösung @Stateless public class TaskRepositoryBean { @PersistenceContext private EntityManager entitymanager; public Task addtask(task task) { } public Task gettaskbyid(long taskid) { } public Task settask(task task) { } public void removetask(task task) { } public List<Task> gettasks( int firstposition, int pagesize) { } Eine generische Basisklasse enthält den gesamten Code für alle Repositories! Alle konkreten Implementierungen bestehen nur aus diesen Zeilen! Generische Lösung public class GenericRepository<K, T> { public T addentity(t entity) { } public T getentitybyid(k entityid) { } public T setentity(t entity) { } public void removeentity(t entity) { } public List<T> queryentities( String queryname, Map<String, Object> queryparameters, int firstposition, int pagesize) { } // EntityManager/Type provided by subclass protected abstract EntityManager getentitymanager(); protected abstract T getentitytype (); @Stateless public class TaskRepositoryBean extends GenericRepository<Long, Task> { @PersistenceContext private EntityManager entitymanager; protected EntityManager getentitymanager() { return this.entitymanager;} protected Class<Task> getentitytype() { return Task.class; }

Quellen Eric Jendrock et. al. The Java EE 6 Tutorial http://docs.oracle.com/javaee/6/tutorial/doc/ Oracle February 2012 Bill Burke & Richard Monson-Heafel Enterprise JavaBeans 3.0, 5th Edition O'Reilly Media, Inc. May 2006 ISBN 978-0-596-00978-6 Adam Bien Real World Java EE Patterns: Rethinking Best Practices press.adam-bien.com June 2009 ISBN 978-0-557-07832-5 34

Vielen Dank! Michael Theis Senior Developer UniCredit Business Integrated Solutions S.C.p.A. email michael.theis@hm.edu phone + 49 89 378-46498 mobile + 49 170 7875474 web http://www.tschutschu.de/lehrauftrag.html 36