32
Der Persistenz-Standard in der Java EE / SE Michael Bouschen akquinet AG [email protected] JPA

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

Embed Size (px)

DESCRIPTION

Die Abbildung relationaler Strukturen einer Datenbank auf die objekt­‐orientierte Programmiersprache Java bringt einige Herausforderungen mit sich, bekannt als object-­relational impedance mismatch. In Java ermöglicht JDBC zwar die Interaktion mir einer relationalen Datenbank aber nicht die Abbildung der Daten auf Objekte. Die bekannten Produkte wie Hibernate oder EclipseLink widmen sich diesem Problem bereits seit Jahren. Mit JPA hat der Java Community Process einen Standard für Java EE und SE definiert, der ein einheitliches API bietet, welches von den Anbietern unterstützt wird. Der Vortrag zeigt was JPA bietet und welche Vorteile der Standard für die Anwendungsentwicklung mit sich bringt.

Citation preview

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