Transcript
Page 1: JPA – Der Persistenz-Standard in der Java EE und SE

Der Persistenz-Standard in der Java EE / SE

Michael Bouschen akquinet AG

[email protected]

JPA

Page 2: JPA – Der Persistenz-Standard in der Java EE und SE

Ü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  

2 Copyright © 2013 – akquinet AG 31.01.2013

Page 3: JPA – Der Persistenz-Standard in der Java EE und SE

Impedance Mismatch

                 

3 31.01.2013

OO Programmiersprache Relationale Algebra

Copyright © 2013 – akquinet AG

Page 4: JPA – Der Persistenz-Standard in der Java EE und SE

Impedance Mismatch (2)

Wo ist das Problem? ¡ Klasse / Attribut -> Tabelle / Spalte

àJDBC

Aber ¡ Persistente Identität

¡ Relationen

¡ Caches

¡ Anfragesprache

4 31.01.2013 Copyright © 2013 – akquinet AG

Page 5: JPA – Der Persistenz-Standard in der Java EE und SE

OR-Mapper

Implementierungen (Auswahl)

5 31.01.2013 Copyright © 2013 – akquinet AG

Page 6: JPA – Der Persistenz-Standard in der Java EE und SE

Persistenz in Java EE

 

BMP

CMP (EJB 1 CMP und EJB 2 CMP)

EJB 3.0: JPA

JPA: Spezifikation – kein Produkt

6 31.01.2013 Copyright © 2013 – akquinet AG

Page 7: JPA – Der Persistenz-Standard in der Java EE und SE

JPA Historie

                 

7 31.01.2013

JPA 1.0 Java EE 5

Mai 2006 Dez 2009 Dez 2012

JPA 2.0 Java EE 6

JPA 2.1 (Public Draft)

Copyright © 2013 – akquinet AG

Page 8: JPA – Der Persistenz-Standard in der Java EE und SE

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

8 31.01.2013 Copyright © 2013 – akquinet AG

Page 9: JPA – Der Persistenz-Standard in der Java EE und SE

JPA 2.0

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

9 31.01.2013 Copyright © 2013 – akquinet AG

Page 10: JPA – Der Persistenz-Standard in der Java EE und SE

JPA 2.1

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

10 31.01.2013 Copyright © 2013 – akquinet AG

Page 11: JPA – Der Persistenz-Standard in der Java EE und SE

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

11 31.01.2013 Copyright © 2013 – akquinet AG

Page 12: JPA – Der Persistenz-Standard in der Java EE und SE

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

12 31.01.2013 Copyright © 2013 – akquinet AG

Page 13: JPA – Der Persistenz-Standard in der Java EE und SE

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, ...  

13 31.01.2013 Copyright © 2013 – akquinet AG

Page 14: JPA – Der Persistenz-Standard in der Java EE und SE

Entity Relationships

14 31.01.2013 Copyright © 2013 – akquinet AG

Page 15: JPA – Der Persistenz-Standard in der Java EE und SE

Mapping von Vererbung

   

15 31.01.2013 Copyright © 2013 – akquinet AG

Page 16: JPA – Der Persistenz-Standard in der Java EE und SE

Mapping von Vererbung

 

SINGLE_TABLE

TABLE_PER_CLASS

JOINED

 

16

PROJECT

ID DISCR NAME CUST_ID DEPT_ID

EXTERNAL_PROJECT

ID NAME CUST_ID

INTERNAL_PROJECT

ID NAME DEPT_ID

EXTERNAL_PROJECT

ID CUST_ID

INTERNAL_PROJECT

ID DEPT_ID

PROJECT

ID NAME

31.01.2013 Copyright © 2013 – akquinet AG

Page 17: JPA – Der Persistenz-Standard in der Java EE und SE

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

17 31.01.2013 Copyright © 2013 – akquinet AG

Page 18: JPA – Der Persistenz-Standard in der Java EE und SE

Ä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()

18 31.01.2013 Copyright © 2013 – akquinet AG

Page 19: JPA – Der Persistenz-Standard in der Java EE und SE

Life  Cycle

19 31.01.2013 Copyright © 2013 – akquinet AG

Page 20: JPA – Der Persistenz-Standard in der Java EE und SE

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

20 31.01.2013 Copyright © 2013 – akquinet AG

Page 21: JPA – Der Persistenz-Standard in der Java EE und SE

Anfragesprache

Java Persistence Query Language (JPQL)

SELECT e.lastname FROM Employee e WHERE e.firstname = 'Michael'

 

21 31.01.2013

Was

Woher

Welche

Copyright © 2013 – akquinet AG

Page 22: JPA – Der Persistenz-Standard in der Java EE und SE

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  

22 31.01.2013 Copyright © 2013 – akquinet AG

Page 23: JPA – Der Persistenz-Standard in der Java EE und SE

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)

23 31.01.2013 Copyright © 2013 – akquinet AG

Page 24: JPA – Der Persistenz-Standard in der Java EE und SE

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();

 24 31.01.2013 Copyright © 2013 – akquinet AG

Page 25: JPA – Der Persistenz-Standard in der Java EE und SE

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

25 31.01.2013 Copyright © 2013 – akquinet AG

Page 26: JPA – Der Persistenz-Standard in der Java EE und SE

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();

26 31.01.2013 Copyright © 2013 – akquinet AG

Page 27: JPA – Der Persistenz-Standard in der Java EE und SE

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

27 31.01.2013 Copyright © 2013 – akquinet AG

Page 28: JPA – Der Persistenz-Standard in der Java EE und SE

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

§ 28 § 31.01.2013 § Copyright © 2013 – akquinet AG

Page 29: JPA – Der Persistenz-Standard in der Java EE und SE

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();

29 31.01.2013 Copyright © 2013 – akquinet AG

Page 30: JPA – Der Persistenz-Standard in der Java EE und SE

Zusammenfassung

¡  JPA = Java Persistenz Standard

¡ Unabhängigkeit OR-Mapper und Datenbank

¡ Verfügbar in Java EE und Java SE

¡  JPA 2.1 Public Draft

30 31.01.2013 Copyright © 2013 – akquinet AG

Page 31: JPA – Der Persistenz-Standard in der Java EE und SE

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

31 31.01.2013 Copyright © 2013 – akquinet AG

Page 32: JPA – Der Persistenz-Standard in der Java EE und SE

Links

32 31.01.2013

http://blog.akquinet.de/

@akquinet

mailto:[email protected]

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

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

Copyright © 2013 – akquinet AG


Recommended