Objektrelationales Mapping mit JPA Querying Jonas Bandi Simon Martinelli.
JPA – Der Persistenz-Standard in der Java EE und SE
description
Transcript of 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
Impedance Mismatch
3 31.01.2013
OO Programmiersprache Relationale Algebra
Copyright © 2013 – akquinet AG
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
OR-Mapper
Implementierungen (Auswahl)
5 31.01.2013 Copyright © 2013 – akquinet AG
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
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
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
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
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
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
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
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
Entity Relationships
14 31.01.2013 Copyright © 2013 – akquinet AG
Mapping von Vererbung
15 31.01.2013 Copyright © 2013 – akquinet AG
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
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
Ä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
Life Cycle
19 31.01.2013 Copyright © 2013 – akquinet AG
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
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
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
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
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
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
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
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
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
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
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
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
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