Der Persistenz-Standard
JPA            in der Java EE / SE



       Michael Bouschen
          akquinet AG
 michael.bouschen@akquinet.de
Über meine Person

   	
  

   Architekt und Projektleiter bei akquinet AG Berlin
   Referenzimplementierung JPA 1
   Mitglied JCP Experten Gruppen:
          JPA 2.0, JPA 2.1, JDO 1, JDO 2
   Apache committer JDO TCK
   	
  




                      Copyright © 2013 – akquinet AG    31.01.2013   2
Impedance Mismatch

   	
  
 OO Programmiersprache                            Relationale Algebra
   	
  
   	
  
   	
  
   	
  
   	
  
   	
  
   	
  
   	
  




                 Copyright © 2013 – akquinet AG                 31.01.2013   3
Impedance Mismatch (2)


   Wo ist das Problem?
   ¡  Klasse / Attribut -> Tabelle / Spalte
    àJDBC
   Aber
   ¡  Persistente Identität
   ¡  Relationen
   ¡  Caches
   ¡  Anfragesprache


                    Copyright © 2013 – akquinet AG   31.01.2013   4
OR-Mapper


   Implementierungen (Auswahl)




               Copyright © 2013 – akquinet AG   31.01.2013   5
Persistenz in Java EE

   	
  

   BMP
   CMP (EJB 1 CMP und EJB 2 CMP)
   EJB 3.0: JPA


   JPA: Spezifikation – kein Produkt




                  Copyright © 2013 – akquinet AG   31.01.2013   6
JPA Historie

   	
  
   	
  
   	
  
   	
  
   	
      JPA 1.0                      JPA 2.0          JPA 2.1
   	
     Java EE 5                    Java EE 6       (Public Draft)
   	
  
   	
  
   	
  

          Mai 2006                     Dez 2009         Dez 2012




                      Copyright © 2013 – akquinet AG                    31.01.2013   7
JPA 1.0


   Spezifikation
   ¡  Teil der EJB 3.0 Spezifikation JSR 220
   ¡  Separates Spezifikationsdokument
   ¡  Linda DeMichiel (Sun), Michael Keith (Oracle)
   ¡  Final Release: Mai 2006
   Implementierungen
   ¡  Referenzimplementierung: Oracle TopLink Essentials
   ¡  Hibernate, OpenJPA, TopLink, SAP, JPOX



                   Copyright © 2013 – akquinet AG      31.01.2013   8
JPA 2.0


   Spezifikation
   ¡  Eigenständiger JSR: JSR-317
   ¡  Linda DeMichiel (Sun)
   ¡  Final Release: Dezember 2009
   Implementierungen
   ¡  Referenzimplementierung: EclipseLink
   ¡  Hibernate, OpenJPA, EclipseLink, SAP, DataNucleus




                   Copyright © 2013 – akquinet AG     31.01.2013   9
JPA 2.1


   Spezifikation
   ¡  Eigenständiger JSR: JSR-338
   ¡  Linda DeMichiel (Sun)
   ¡  Public Review: Dezember 2012
   Implementierungen
   ¡  Referenzimplementierung: EclipseLink
   ¡  Hibernate, OpenJPA, EclipseLink, SAP, DataNucleus




                   Copyright © 2013 – akquinet AG     31.01.2013   10
JPA Features


  ¡  POJO-basiertes Persistenzmodell
  ¡  Domainmodell unterstützt Vererbung, Polymorphie, etc.
  ¡  Standardisiertes objekt-relationales Mapping
  ¡  Anfragesprache
  ¡  Standardisiertes (Runtime-)API
  ¡  Verfügbar in Java EE und Java SE
  ¡  Unabhängigkeit von Datenbank und OR-Mapper




                   Copyright © 2013 – akquinet AG       31.01.2013   11
Entity Klassen – POJO


  ¡  Kein Interface notwendig
      (wie z.B. EntityBean)
  ¡  Top-Level Klasse
      (abstrakt oder konkret)
  ¡  Entity und Nicht-Entity Klassen
      in Vererbungshierarchie
  ¡  Objekterzeugung mit new




                    Copyright © 2013 – akquinet AG   31.01.2013   12
Objektrelationales Mapping


   Allgemeines
   ¡  Abbildung Java Klasse ↔ relationale Datenbank
   ¡  Abbildung von Assoziationen
   ¡  Mapping Metadaten als Annotationen oder XML
   ¡  Default Regeln z.B. für Tabellen- und Spaltennamen
   Annotationen
   ¡  Logisch: @Id, @OneToMany, @Transient, @Lob, ...
   ¡  Physikalisch: @Table, @SecondaryTable, @Column, ...
   	
  

                   Copyright © 2013 – akquinet AG            31.01.2013   13
Entity Relationships




              Copyright © 2013 – akquinet AG   31.01.2013   14
Mapping von Vererbung


          	
  
   	
  




                 Copyright © 2013 – akquinet AG   31.01.2013   15
Mapping von Vererbung


   	
  
                                                                PROJECT
          SINGLE_TABLE                           ID DISCR NAME CUST_ID DEPT_ID



                                                 EXTERNAL_PROJECT          INTERNAL_PROJECT
          TABLE_PER_CLASS                         ID NAME CUST_ID            ID NAME DEPT_ID


                                                                   PROJECT
          JOINED                                                   ID NAME

                                                    EXTERNAL_PROJECT      INTERNAL_PROJECT
                                                          ID CUST_ID         ID DEPT_ID
   	
  

                         Copyright © 2013 – akquinet AG                              31.01.2013   16
EntityManager


   Kommunikation JPA-Laufzeitumgebung
   ¡  Zentrale Schnittstelle zur Datenbank
   ¡  Life Cycle Methoden: persist, remove, merge
   ¡  Zugriffsmethoden: find, getReference
   ¡  Query Methoden: createQuery, createNamedQuery,
                             createNativeQuery

   ¡  Cache Methoden: flush, refresh, clear, contains
   ¡  Zugriff auf Transaktionen: getTransaction



                   Copyright © 2013 – akquinet AG        31.01.2013   17
Änderungsoperationen


   ¡  Nur innerhalb von Transaktionen
   ¡  Create: em.persist(...)
   ¡  Update:
     –  Änderung der Entität (z.B. per Setter)
     –  Keine explizite save-Operation
   ¡  Delete: em.remove(...)
   ¡  Änderungen wirksam bei em.flush(), em.commit()




                    Copyright © 2013 – akquinet AG      31.01.2013   18
Life	
  Cycle
Persistenzkontext


   Laufzeitkonzept
   ¡  Menge von „managed“ Entity Instanzen zur Laufzeit
   ¡  Genau eine Enitity Instanz per Identität
   ¡  Zugriff über EntityManager Interface
   ¡  Alle Instanzen sind auf die gleiche Datenbank abgebildet
   Persistenzkontext Typen
   ¡  Transaction
   ¡  Extended


                     Copyright © 2013 – akquinet AG        31.01.2013   20
Anfragesprache


   Java Persistence Query Language (JPQL)



                               Was
      SELECT e.lastname
      FROM Employee e                                     Woher
      WHERE e.firstname = 'Michael'
       	
  
                                                 Welche




                Copyright © 2013 – akquinet AG                    31.01.2013   21
JPQL


  ¡  Syntax an SQL orientiert	
  
    SELECT p FROM Project p JOIN p.employees e
      WHERE p.firstname = :name

    UPDATE Employee e SET e.salary = e.salary * 1.05

    DELETE FROM Employee e WHERE e.name = 'Michael'

  ¡  Domain-­‐Modell	
  (Klassen,	
  A2ribute,	
  Rela8onships)	
  
  ¡  Pfad-­‐Ausdrücke	
  e.department.company.name
  ¡  Query	
  Parameter	
  




                        Copyright © 2013 – akquinet AG                 31.01.2013   22
Query Erzeugung


   ¡  Query Instanz repräsentiert Anfrage zur Laufzeit
   ¡  EntityManager ist Query Factory:
        Dynamische Query: createQuery(String)
        Criteria API Query: createQuery(CriteriaBuilder)
        Statische Query: createNamedQuery(String)
        SQL Query: createNativeQuery(String)




                   Copyright © 2013 – akquinet AG         31.01.2013   23
Query	
  Ausführung


   Query q = em.createQuery(
       "SELECT d FROM Department d");
   List<Department> ds = (List<Department>)q.getResultList();


   Query q = em.createQuery(
       "SELECT COUNT(d) FROM Department d");
   Long count = (Long)q.getSingleResult();


   Query q = em.createQuery(
     "UPDATE Employee e SET e.salary = e.salary * 1.05";
   int changes = q.executeUpdate();


   	
  
                  Copyright © 2013 – akquinet AG       31.01.2013   24
Query Criteria API


   ¡  API zur dynamischen Erzeugung von Queries
   ¡  Keine String Manipulation
   ¡  Typesafe Queries: Überprüfung zur Compile-Zeit
   ¡  Query Ergebnis ist getypt
   ¡  Option: String-based oder strongly- typed




                   Copyright © 2013 – akquinet AG       31.01.2013   25
Query Criteria API


    Query q = em.createQuery(
      "SELECT e FROM Employee e WHERE e.firstname = ‘Michael‘");
    List<Employee> emps= (List<Employee>)q.getResultList();


    CriteriaBuilder cb = em.getCriteriaBuilder();
    CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
    Root<Employee> e = cq.from(Employee.class);
    cq.select(e);
    cq.where(cb.equal(e.get(Employee_.firstname), "Michael"));
    TypedQuery<Employee> tq = em.createQuery(cq);
    List<Employee> results = tq.getResultList();




                  Copyright © 2013 – akquinet AG       31.01.2013   26
Persistence Unit


   ¡  Menge von Entity Klassen
   ¡  Definiert in META-INF/persistence.xml
   ¡  Abgebildet auf genau eine Datenbank
   ¡  Identifiziert durch eindeutigen Namen
   ¡  Definiert den Persistence Provider
   ¡  Kann Provider-spezifische Properties beinhalten




                   Copyright © 2013 – akquinet AG        31.01.2013   27
JPA und Java EE


   JPA als Standard Persistenz Konzept in Java EE
   ¡  EntitiyManager injiziert oder per JNDI Lookup
   ¡  Transaktionskontrolle durch Container
   ¡  Container verwaltet und propagiert Persistenzkontext
   ¡  Automatisches Scannen der Entity Klassen während des
       Deployment




                  § Copyright © 2013 – akquinet AG      § 31.01.2013   § 28
JPA und Java SE


   ¡  Konfiguration persistence.xml
     –  in META-INF oder im Classpath
     –  muss alle Entity Klassen aufzählen
   ¡  Manuelle Transaktionskontrolle
   ¡  Bootstrap API javax.persistence.Persistence erzeugt
       EntityManagerFactory für Peristence Unit

     EntityManagerFactory emf = Persistence.
       createEntityManagerFactory(puName, properties);
     EntityManager em = emf.createEntityManager();


                   Copyright © 2013 – akquinet AG        31.01.2013   29
Zusammenfassung


  ¡  JPA = Java Persistenz Standard
  ¡  Unabhängigkeit OR-Mapper und Datenbank
  ¡  Verfügbar in Java EE und Java SE
  ¡  JPA 2.1 Public Draft




                  Copyright © 2013 – akquinet AG   31.01.2013   30
Ausblick JPA 2.1

   ¡  Unterstützung Typ Konvertierung im OR-Mapping
   ¡  Schema Generierung
   ¡  Entity Graphs
   ¡  Query Erweiterungen: JOIN ON, Datenbank-Funktionen,
       Downcast, SubQueries in Expressions, ...
   ¡  Unterstützung für Stored Procedures
   ¡  Criteria API: delete und update
   ¡  Nicht-synchronisierter Persistenzkontext
   ¡  CDI Injection in Entity Listener
   ¡  Annotationen für Index und ForeignKey

                       Copyright © 2013 – akquinet AG        31.01.2013   31
Links



        mailto:michael.bouschen@akquinet.de

        http://blog.akquinet.de/

        @akquinet

        http://jcp.org/en/jsr/detail?id=338

        http://java.net/projects/jpa-spec/lists/users/archive




            Copyright © 2013 – akquinet AG                      31.01.2013   32

JPA – Der Persistenz-­Standard in der Java EE und SE

  • 1.
    Der Persistenz-Standard JPA in der Java EE / SE Michael Bouschen akquinet AG michael.bouschen@akquinet.de
  • 2.
    Über meine Person   Architekt und Projektleiter bei akquinet AG Berlin Referenzimplementierung JPA 1 Mitglied JCP Experten Gruppen: JPA 2.0, JPA 2.1, JDO 1, JDO 2 Apache committer JDO TCK   Copyright © 2013 – akquinet AG 31.01.2013 2
  • 3.
    Impedance Mismatch   OO Programmiersprache Relationale Algebra                 Copyright © 2013 – akquinet AG 31.01.2013 3
  • 4.
    Impedance Mismatch (2) Wo ist das Problem? ¡  Klasse / Attribut -> Tabelle / Spalte àJDBC Aber ¡  Persistente Identität ¡  Relationen ¡  Caches ¡  Anfragesprache Copyright © 2013 – akquinet AG 31.01.2013 4
  • 5.
    OR-Mapper Implementierungen (Auswahl) Copyright © 2013 – akquinet AG 31.01.2013 5
  • 6.
    Persistenz in JavaEE   BMP CMP (EJB 1 CMP und EJB 2 CMP) EJB 3.0: JPA JPA: Spezifikation – kein Produkt Copyright © 2013 – akquinet AG 31.01.2013 6
  • 7.
    JPA Historie           JPA 1.0 JPA 2.0 JPA 2.1   Java EE 5 Java EE 6 (Public Draft)       Mai 2006 Dez 2009 Dez 2012 Copyright © 2013 – akquinet AG 31.01.2013 7
  • 8.
    JPA 1.0 Spezifikation ¡  Teil der EJB 3.0 Spezifikation JSR 220 ¡  Separates Spezifikationsdokument ¡  Linda DeMichiel (Sun), Michael Keith (Oracle) ¡  Final Release: Mai 2006 Implementierungen ¡  Referenzimplementierung: Oracle TopLink Essentials ¡  Hibernate, OpenJPA, TopLink, SAP, JPOX Copyright © 2013 – akquinet AG 31.01.2013 8
  • 9.
    JPA 2.0 Spezifikation ¡  Eigenständiger JSR: JSR-317 ¡  Linda DeMichiel (Sun) ¡  Final Release: Dezember 2009 Implementierungen ¡  Referenzimplementierung: EclipseLink ¡  Hibernate, OpenJPA, EclipseLink, SAP, DataNucleus Copyright © 2013 – akquinet AG 31.01.2013 9
  • 10.
    JPA 2.1 Spezifikation ¡  Eigenständiger JSR: JSR-338 ¡  Linda DeMichiel (Sun) ¡  Public Review: Dezember 2012 Implementierungen ¡  Referenzimplementierung: EclipseLink ¡  Hibernate, OpenJPA, EclipseLink, SAP, DataNucleus Copyright © 2013 – akquinet AG 31.01.2013 10
  • 11.
    JPA Features ¡  POJO-basiertes Persistenzmodell ¡  Domainmodell unterstützt Vererbung, Polymorphie, etc. ¡  Standardisiertes objekt-relationales Mapping ¡  Anfragesprache ¡  Standardisiertes (Runtime-)API ¡  Verfügbar in Java EE und Java SE ¡  Unabhängigkeit von Datenbank und OR-Mapper Copyright © 2013 – akquinet AG 31.01.2013 11
  • 12.
    Entity Klassen –POJO ¡  Kein Interface notwendig (wie z.B. EntityBean) ¡  Top-Level Klasse (abstrakt oder konkret) ¡  Entity und Nicht-Entity Klassen in Vererbungshierarchie ¡  Objekterzeugung mit new Copyright © 2013 – akquinet AG 31.01.2013 12
  • 13.
    Objektrelationales Mapping Allgemeines ¡  Abbildung Java Klasse ↔ relationale Datenbank ¡  Abbildung von Assoziationen ¡  Mapping Metadaten als Annotationen oder XML ¡  Default Regeln z.B. für Tabellen- und Spaltennamen Annotationen ¡  Logisch: @Id, @OneToMany, @Transient, @Lob, ... ¡  Physikalisch: @Table, @SecondaryTable, @Column, ...   Copyright © 2013 – akquinet AG 31.01.2013 13
  • 14.
    Entity Relationships Copyright © 2013 – akquinet AG 31.01.2013 14
  • 15.
    Mapping von Vererbung     Copyright © 2013 – akquinet AG 31.01.2013 15
  • 16.
    Mapping von Vererbung   PROJECT SINGLE_TABLE ID DISCR NAME CUST_ID DEPT_ID EXTERNAL_PROJECT INTERNAL_PROJECT TABLE_PER_CLASS ID NAME CUST_ID ID NAME DEPT_ID PROJECT JOINED ID NAME EXTERNAL_PROJECT INTERNAL_PROJECT ID CUST_ID ID DEPT_ID   Copyright © 2013 – akquinet AG 31.01.2013 16
  • 17.
    EntityManager Kommunikation JPA-Laufzeitumgebung ¡  Zentrale Schnittstelle zur Datenbank ¡  Life Cycle Methoden: persist, remove, merge ¡  Zugriffsmethoden: find, getReference ¡  Query Methoden: createQuery, createNamedQuery, createNativeQuery ¡  Cache Methoden: flush, refresh, clear, contains ¡  Zugriff auf Transaktionen: getTransaction Copyright © 2013 – akquinet AG 31.01.2013 17
  • 18.
    Änderungsoperationen ¡  Nur innerhalb von Transaktionen ¡  Create: em.persist(...) ¡  Update: –  Änderung der Entität (z.B. per Setter) –  Keine explizite save-Operation ¡  Delete: em.remove(...) ¡  Änderungen wirksam bei em.flush(), em.commit() Copyright © 2013 – akquinet AG 31.01.2013 18
  • 19.
  • 20.
    Persistenzkontext Laufzeitkonzept ¡  Menge von „managed“ Entity Instanzen zur Laufzeit ¡  Genau eine Enitity Instanz per Identität ¡  Zugriff über EntityManager Interface ¡  Alle Instanzen sind auf die gleiche Datenbank abgebildet Persistenzkontext Typen ¡  Transaction ¡  Extended Copyright © 2013 – akquinet AG 31.01.2013 20
  • 21.
    Anfragesprache Java Persistence Query Language (JPQL) Was SELECT e.lastname FROM Employee e Woher WHERE e.firstname = 'Michael'   Welche Copyright © 2013 – akquinet AG 31.01.2013 21
  • 22.
    JPQL ¡ Syntax an SQL orientiert   SELECT p FROM Project p JOIN p.employees e WHERE p.firstname = :name UPDATE Employee e SET e.salary = e.salary * 1.05 DELETE FROM Employee e WHERE e.name = 'Michael' ¡  Domain-­‐Modell  (Klassen,  A2ribute,  Rela8onships)   ¡  Pfad-­‐Ausdrücke  e.department.company.name ¡  Query  Parameter   Copyright © 2013 – akquinet AG 31.01.2013 22
  • 23.
    Query Erzeugung ¡  Query Instanz repräsentiert Anfrage zur Laufzeit ¡  EntityManager ist Query Factory: Dynamische Query: createQuery(String) Criteria API Query: createQuery(CriteriaBuilder) Statische Query: createNamedQuery(String) SQL Query: createNativeQuery(String) Copyright © 2013 – akquinet AG 31.01.2013 23
  • 24.
    Query  Ausführung Query q = em.createQuery( "SELECT d FROM Department d"); List<Department> ds = (List<Department>)q.getResultList(); Query q = em.createQuery( "SELECT COUNT(d) FROM Department d"); Long count = (Long)q.getSingleResult(); Query q = em.createQuery( "UPDATE Employee e SET e.salary = e.salary * 1.05"; int changes = q.executeUpdate();   Copyright © 2013 – akquinet AG 31.01.2013 24
  • 25.
    Query Criteria API ¡  API zur dynamischen Erzeugung von Queries ¡  Keine String Manipulation ¡  Typesafe Queries: Überprüfung zur Compile-Zeit ¡  Query Ergebnis ist getypt ¡  Option: String-based oder strongly- typed Copyright © 2013 – akquinet AG 31.01.2013 25
  • 26.
    Query Criteria API Query q = em.createQuery( "SELECT e FROM Employee e WHERE e.firstname = ‘Michael‘"); List<Employee> emps= (List<Employee>)q.getResultList(); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Employee> cq = cb.createQuery(Employee.class); Root<Employee> e = cq.from(Employee.class); cq.select(e); cq.where(cb.equal(e.get(Employee_.firstname), "Michael")); TypedQuery<Employee> tq = em.createQuery(cq); List<Employee> results = tq.getResultList(); Copyright © 2013 – akquinet AG 31.01.2013 26
  • 27.
    Persistence Unit ¡  Menge von Entity Klassen ¡  Definiert in META-INF/persistence.xml ¡  Abgebildet auf genau eine Datenbank ¡  Identifiziert durch eindeutigen Namen ¡  Definiert den Persistence Provider ¡  Kann Provider-spezifische Properties beinhalten Copyright © 2013 – akquinet AG 31.01.2013 27
  • 28.
    JPA und JavaEE JPA als Standard Persistenz Konzept in Java EE ¡  EntitiyManager injiziert oder per JNDI Lookup ¡  Transaktionskontrolle durch Container ¡  Container verwaltet und propagiert Persistenzkontext ¡  Automatisches Scannen der Entity Klassen während des Deployment § Copyright © 2013 – akquinet AG § 31.01.2013 § 28
  • 29.
    JPA und JavaSE ¡  Konfiguration persistence.xml –  in META-INF oder im Classpath –  muss alle Entity Klassen aufzählen ¡  Manuelle Transaktionskontrolle ¡  Bootstrap API javax.persistence.Persistence erzeugt EntityManagerFactory für Peristence Unit EntityManagerFactory emf = Persistence. createEntityManagerFactory(puName, properties); EntityManager em = emf.createEntityManager(); Copyright © 2013 – akquinet AG 31.01.2013 29
  • 30.
    Zusammenfassung ¡ JPA = Java Persistenz Standard ¡  Unabhängigkeit OR-Mapper und Datenbank ¡  Verfügbar in Java EE und Java SE ¡  JPA 2.1 Public Draft Copyright © 2013 – akquinet AG 31.01.2013 30
  • 31.
    Ausblick JPA 2.1 ¡  Unterstützung Typ Konvertierung im OR-Mapping ¡  Schema Generierung ¡  Entity Graphs ¡  Query Erweiterungen: JOIN ON, Datenbank-Funktionen, Downcast, SubQueries in Expressions, ... ¡  Unterstützung für Stored Procedures ¡  Criteria API: delete und update ¡  Nicht-synchronisierter Persistenzkontext ¡  CDI Injection in Entity Listener ¡  Annotationen für Index und ForeignKey Copyright © 2013 – akquinet AG 31.01.2013 31
  • 32.
    Links mailto:michael.bouschen@akquinet.de http://blog.akquinet.de/ @akquinet http://jcp.org/en/jsr/detail?id=338 http://java.net/projects/jpa-spec/lists/users/archive Copyright © 2013 – akquinet AG 31.01.2013 32