Upload
hwilming
View
1.664
Download
0
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
Ü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