SlideShare ist ein Scribd-Unternehmen logo
Java Persistence in Action
Features jenseits des Entry-Levels
Dirk Weil, GEDOPLAN GmbH
Dirk Weil
GEDOPLAN GmbH, Bielefeld
Java EE seit 1998
Konzeption und
Realisierung
Seminare
Vorträge
Veröffentlichungen
Java Persistence in Action - Features jenseits des Entry-Levels 2
ZEILEN
Java Persistence in Action - Features jenseits des Entry-Levels 3
Composite IDs
Basics:
ID-Klasse
@Embeddable
public class BranchId implements Serializable
{
private int companyId;
private int branchNo;
Java Persistence in Action - Features jenseits des Entry-Levels 4
Composite IDs
Basics:
@EmbeddedId
oder mehrere @Id
@Entity
public class SuperMarket
{
@EmbeddedId
private BranchId id;
@Entity
@IdClass(BranchId.class)
public class PetrolStation
{
@Id
private int companyId;
@Id
private int branchNo;
Java Persistence in Action - Features jenseits des Entry-Levels 5
Composite IDs
PK/FK-Überlappung
@Embeddable
public class EtageId
implements Serializable
{
@Column(name = "GEBAEUDE_ID")
private Long gebaeudeId;
private int stock;
@Entity
public class Etage
{
@EmbeddedId
private EtageId id;
@MapsId("gebaeudeId")
@ManyToOne
private Gebaeude gebaeude;
Java Persistence in Action - Features jenseits des Entry-Levels 6
Composite IDs
PK/FK-Überlappung
public class FluegelId
implements Serializable
{
private Long gebaeude;
private String fluegelKz;
@Entity
@IdClass(FluegelId.class)
public class Fluegel
{
@Id @ManyToOne
private Gebaeude gebaeude;
@Id @Column(name = "FLUEGEL_KZ")
private String fluegelKz;
Java Persistence in Action - Features jenseits des Entry-Levels 7
Composite IDs
PK/FK-Überlappung
Java Persistence in Action - Features jenseits des Entry-Levels 8
Composite IDs
Mehrfach-Mapping auf gleiche Spalte
…
@Id @ManyToOne
private Gebaeude gebaeude;
@ManyToOne
@JoinColumns({
@JoinColumn(name = "GEBAEUDE_ID", referencedColumnName = "GEBAEUDE_ID",
insertable = false, updatable = false),
@JoinColumn(name = "FLUEGEL_KZ", referencedColumnName = "FLUEGEL_KZ",
insertable = false, updatable = false)
})
private Fluegel fluegel;
…
Java Persistence in Action - Features jenseits des Entry-Levels 9
Composite IDs
Mehrfach-Mapping auf gleiche Spalte
s. Demo-Klassen Flur und Raum
Nachteile:
Überlappende Relationsattribute können nicht unabhängig voneinander
gesetzt werden
null ist i. A nicht möglich
Java Persistence in Action - Features jenseits des Entry-Levels 10
Optimistic Locking
Standardverfahren:
Versionsattribut
setzt zusätzliche
Spalte voraus
@Entity
public class Person
{
@Version
private long version;
Java Persistence in Action - Features jenseits des Entry-Levels 11
Optimistic Locking
Providerabhängig weitere Verfahren
ohne explizite Versionsspalte
s. Demoklasse Person
verglichene
Spalten
EclipseLink Hibernate OpenJPA
alle   
veränderte  
weitere  
Java Persistence in Action - Features jenseits des Entry-Levels 12
Inheritance
Mögliche Strategie SINGLE_TABLE
benötigt Diskriminator-Spalte
Vehicle
Car Ship
Lorry
Java Persistence in Action - Features jenseits des Entry-Levels 13
Inheritance
Provider-abhängig auch ohne Diskriminator-Spalte
s. Demoklassen Vehicle etc.
Typ-Ermittlung für
gelesene Zeilen
Query-Filter
EclipseLink @ClassExtractor @Customizer
Hibernate @DiscriminatorFormula
OpenJPA @DiscriminatorStrategy
Java Persistence in Action - Features jenseits des Entry-Levels 14
Polymorphe Assoziationen
Foreign Key mit multiplem Ziel
Java Persistence in Action - Features jenseits des Entry-Levels 15
Polymorphe Assoziationen
Nur Provider-abhängig möglich
s. Demo-Klasse Employee etc.
Annotation für Relationsattribut
EclipseLink @VariableOneToOne
Hibernate @Any, @AnyMetaData
Java Persistence in Action - Features jenseits des Entry-Levels 16
Custom Types
Unnatürliche DB-Werte, z. B.:
true  'J'
false  'N'
Provider-
abhängiges
Mapping
s. Demo-Klasse Projekt
Alternative: Life Cycle Methods
Annotation
EclipseLink @ObjectTypeConverter,
@Converter
Hibernate @Type
OpenJPA @ExternalValues,
@Type
Java Persistence in Action - Features jenseits des Entry-Levels 17
Custom Types
Seit JPA 2.1:
Converter
@Converter
public class JNConverter implements AttributeConverter<Boolean, String> {
public String convertToDatabaseColumn(Boolean attributeValue) {
if (attributeValue == null) return null;
return attributeValue ? "J" : "N";
}
public Boolean convertToEntityAttribute(String columnValue) {
if (columnValue == null) return null;
return columnValue.equals("J");
@Entity
public class Projekt
{
@Convert(converter = JNConverter.class)
private boolean aktiv;
Java Persistence in Action - Features jenseits des Entry-Levels 18
Packed Column Values
Mehrere Werte in einer DB-Spalte
@Entity
public class Projekt
{
…
private String projektTyp;
Budget
A Aufwand
H Höchstpreis
F Festpreis
Tätigkeit
40 Beratung
60 Schulung
81 Programmierung
4 0F
Java Persistence in Action - Features jenseits des Entry-Levels 19
Packed Column Values
(Un-)Boxing mittels Life Cycle Methods
Nachteil: Query View  Class API
@Entity
public class Projekt {
…
private String projektTyp;
@Transient private BudgetTyp budgetTyp;
@Transient private Taetigkeit taetigkeit;
@PrePersist @PreUpdate
private void preStore() {
projektTyp = budgetTyp.getKuerzel() + taetigkeit.getKuerzel();
}
Java Persistence in Action - Features jenseits des Entry-Levels 20
Fetch Tuning
ToMany-Fetching: "N+1"-Problem
z.B. Lesen der User inkl. Groups + Permissions
SELECT ... FROM USER
SELECT ... FROM USER_GROUP t0, GROUP t1 WHERE t0.USER_ID=? AND …
SELECT ... FROM PERMISSION WHERE GROUP_ID=?
SELECT ... FROM PERMISSION WHERE GROUP_ID=?
SELECT ... FROM USER_GROUP t0, GROUP t1 WHERE t0.USER_ID=? AND …
SELECT ... FROM USER_GROUP t0, GROUP t1 WHERE t0.USER_ID=? AND …
Java Persistence in Action - Features jenseits des Entry-Levels 21
Fetch Tuning
Lösungsansatz 1: Join Fetching
erzeugt 1 (!) SELECT
Achtung: Volumen!
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class);
Root<User> u = criteriaQuery.from(User.class);
u.fetch(User_.groups, JoinType.LEFT).fetch(Group_.permissions, JoinType.LEFT);
criteriaQuery.select(u).distinct(true);
List<User> users = entityManager.createQuery(criteriaQuery).getResultList();
Java Persistence in Action - Features jenseits des Entry-Levels 22
Fetch Tuning
Lösungsansatz 2: Batch Fetching
erzeugt 1 SELECT pro 'Ebene'
s. Demoklassen User etc.
@ManyToMany(fetch = FetchType.LAZY, …)
@BatchFetch(value = BatchFetchType.IN, size = 10)
private Set<Group> groups;
Annotation Relationsauflösung
EclipseLink @BatchFetch IN, EXISTS, JOIN
Hibernate @BatchSize IN, EXISTS
OpenJPA @EagerFetchMode
(nur für EAGER!)
JOIN
(='PARALLEL')
Java Persistence in Action - Features jenseits des Entry-Levels 23
Second Level Cache
JPA 2.0 unterstützt 2nd Level Cache
Wirkt applikationsweit
Semantik ähnlich
HashMap
Ladereihenfolge:
1st Level Cache
(EntityManager)
2nd Level Cache, falls enabled
DB
JPA Provider
EntityManager
2nd
Level
Cache
1st
Level
Cache
Java Persistence in Action - Features jenseits des Entry-Levels 24
Second Level Cache
Konfiguration
<persistence-unit name="…">
<provider>…</provider>
<shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
…
Cache aktiv für …
ALL alle Entities
NONE keine Klasse
ENABLE_SELECTIVE nur @Cacheable(true)
DISABLE_SELECTIVE alle außer @Cacheable(false)
@Entity
@Cacheable(true)
public class Land
{
…
Java Persistence in Action - Features jenseits des Entry-Levels 25
Second Level Cache
Vorteil bei
häufig genutzten
(nahezu) konstanten
Daten
s. Demo-Klassen Kunde und Land
Kunde
Land
1
*
Java Persistence in Action - Features jenseits des Entry-Levels 26
Query Cache
Providerspezifisch
i. A. Teil des 2nd Level Cache
Speichert Result Set IDs zu Queries
Trotz mehrfacher Ausführung
nur ein DB-Zugriff
Java Persistence in Action - Features jenseits des Entry-Levels 27
Query Cache
Aktivierung durch Query Hints
Map-Semantik
Key = Query-Text + Parameter
s. Demo-Klasse Land
TypedQuery<Land> query = entityManager.createQuery(…, Land.class);
query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase");
List<Land> laender = query.getResultList();
Java Persistence in Action - Features jenseits des Entry-Levels 28
Fazit
JPA out-of-the-box nur für
"grüne Wiese"
DB-Modelle mittlerer Komplexität
Legacy-Anforderungen lösbar
teilweise nur Provider-spezifisch
Diverse "Stellschrauben" zur Optimierung
teilweise nur Provider-spezifisch
Java Persistence in Action - Features jenseits des Entry-Levels 29
Präsentation / Demo-Projekt
http://de.slideshare.net/gedoplan/
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
https://github.com/dirkweil/
javaPersistenceInAction
Java Persistence in Action - Features jenseits des Entry-Levels 30
More
http://www.gedoplan-it-training.de
Seminare in Berlin, Bielefeld, Inhouse
http://www.gedoplan-it-consulting.de
Reviews, Coaching, …
http://javaeeblog.wordpress.com/
http://expertenkreisjava.blogspot.de/
 dirk.weil@gedoplan.de
@dirkweil
Java Persistence in Action - Features jenseits des Entry-Levels 31

Weitere ähnliche Inhalte

Ähnlich wie javaPersistenceInActionFeaturesJenseitsDesEntryLevels

Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
JPA the Versant Way
JPA the Versant WayJPA the Versant Way
JPA the Versant Wayjubecker
 
Optimierung von JPA-Anwendungen
Optimierung von JPA-AnwendungenOptimierung von JPA-Anwendungen
Optimierung von JPA-Anwendungengedoplan
 
Besseren Java Code mit Type Annotations
Besseren Java Code mit Type AnnotationsBesseren Java Code mit Type Annotations
Besseren Java Code mit Type Annotationsdzuvic
 
DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBasegedoplan
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
Celery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für DjangoCelery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für DjangoMarkus Zapke-Gründemann
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeldgedoplan
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisierenHendrik Lösch
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierungos890
 
JPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SEJPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SEhwilming
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Michael Kurz
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Gwt Techtalk Präsentation
Gwt Techtalk PräsentationGwt Techtalk Präsentation
Gwt Techtalk Präsentationmlegenhausen
 
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoCDevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoCDevDay Dresden
 

Ähnlich wie javaPersistenceInActionFeaturesJenseitsDesEntryLevels (20)

Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
JPA the Versant Way
JPA the Versant WayJPA the Versant Way
JPA the Versant Way
 
Optimierung von JPA-Anwendungen
Optimierung von JPA-AnwendungenOptimierung von JPA-Anwendungen
Optimierung von JPA-Anwendungen
 
Besseren Java Code mit Type Annotations
Besseren Java Code mit Type AnnotationsBesseren Java Code mit Type Annotations
Besseren Java Code mit Type Annotations
 
DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBase
 
Java EE 5
Java EE 5Java EE 5
Java EE 5
 
Feature Flags mit Togglz
Feature Flags mit TogglzFeature Flags mit Togglz
Feature Flags mit Togglz
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Celery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für DjangoCelery - eine asynchrone Task Queue (nicht nur) für Django
Celery - eine asynchrone Task Queue (nicht nur) für Django
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Feige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-UmfeldFeige sein! Testen im Java-EE-Umfeld
Feige sein! Testen im Java-EE-Umfeld
 
Legacy Code refaktorisieren
Legacy Code refaktorisierenLegacy Code refaktorisieren
Legacy Code refaktorisieren
 
Metadatenbasierte Validierung
Metadatenbasierte ValidierungMetadatenbasierte Validierung
Metadatenbasierte Validierung
 
JPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SEJPA – Der Persistenz-­Standard in der Java EE und SE
JPA – Der Persistenz-­Standard in der Java EE und SE
 
Codesmells
CodesmellsCodesmells
Codesmells
 
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Gwt Techtalk Präsentation
Gwt Techtalk PräsentationGwt Techtalk Präsentation
Gwt Techtalk Präsentation
 
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoCDevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
DevDay 2016: Hendrik Lösch - Lose gekoppelt wie nie: DI vs. IoC
 

javaPersistenceInActionFeaturesJenseitsDesEntryLevels

  • 1. Java Persistence in Action Features jenseits des Entry-Levels Dirk Weil, GEDOPLAN GmbH
  • 2. Dirk Weil GEDOPLAN GmbH, Bielefeld Java EE seit 1998 Konzeption und Realisierung Seminare Vorträge Veröffentlichungen Java Persistence in Action - Features jenseits des Entry-Levels 2
  • 3. ZEILEN Java Persistence in Action - Features jenseits des Entry-Levels 3
  • 4. Composite IDs Basics: ID-Klasse @Embeddable public class BranchId implements Serializable { private int companyId; private int branchNo; Java Persistence in Action - Features jenseits des Entry-Levels 4
  • 5. Composite IDs Basics: @EmbeddedId oder mehrere @Id @Entity public class SuperMarket { @EmbeddedId private BranchId id; @Entity @IdClass(BranchId.class) public class PetrolStation { @Id private int companyId; @Id private int branchNo; Java Persistence in Action - Features jenseits des Entry-Levels 5
  • 6. Composite IDs PK/FK-Überlappung @Embeddable public class EtageId implements Serializable { @Column(name = "GEBAEUDE_ID") private Long gebaeudeId; private int stock; @Entity public class Etage { @EmbeddedId private EtageId id; @MapsId("gebaeudeId") @ManyToOne private Gebaeude gebaeude; Java Persistence in Action - Features jenseits des Entry-Levels 6
  • 7. Composite IDs PK/FK-Überlappung public class FluegelId implements Serializable { private Long gebaeude; private String fluegelKz; @Entity @IdClass(FluegelId.class) public class Fluegel { @Id @ManyToOne private Gebaeude gebaeude; @Id @Column(name = "FLUEGEL_KZ") private String fluegelKz; Java Persistence in Action - Features jenseits des Entry-Levels 7
  • 8. Composite IDs PK/FK-Überlappung Java Persistence in Action - Features jenseits des Entry-Levels 8
  • 9. Composite IDs Mehrfach-Mapping auf gleiche Spalte … @Id @ManyToOne private Gebaeude gebaeude; @ManyToOne @JoinColumns({ @JoinColumn(name = "GEBAEUDE_ID", referencedColumnName = "GEBAEUDE_ID", insertable = false, updatable = false), @JoinColumn(name = "FLUEGEL_KZ", referencedColumnName = "FLUEGEL_KZ", insertable = false, updatable = false) }) private Fluegel fluegel; … Java Persistence in Action - Features jenseits des Entry-Levels 9
  • 10. Composite IDs Mehrfach-Mapping auf gleiche Spalte s. Demo-Klassen Flur und Raum Nachteile: Überlappende Relationsattribute können nicht unabhängig voneinander gesetzt werden null ist i. A nicht möglich Java Persistence in Action - Features jenseits des Entry-Levels 10
  • 11. Optimistic Locking Standardverfahren: Versionsattribut setzt zusätzliche Spalte voraus @Entity public class Person { @Version private long version; Java Persistence in Action - Features jenseits des Entry-Levels 11
  • 12. Optimistic Locking Providerabhängig weitere Verfahren ohne explizite Versionsspalte s. Demoklasse Person verglichene Spalten EclipseLink Hibernate OpenJPA alle    veränderte   weitere   Java Persistence in Action - Features jenseits des Entry-Levels 12
  • 13. Inheritance Mögliche Strategie SINGLE_TABLE benötigt Diskriminator-Spalte Vehicle Car Ship Lorry Java Persistence in Action - Features jenseits des Entry-Levels 13
  • 14. Inheritance Provider-abhängig auch ohne Diskriminator-Spalte s. Demoklassen Vehicle etc. Typ-Ermittlung für gelesene Zeilen Query-Filter EclipseLink @ClassExtractor @Customizer Hibernate @DiscriminatorFormula OpenJPA @DiscriminatorStrategy Java Persistence in Action - Features jenseits des Entry-Levels 14
  • 15. Polymorphe Assoziationen Foreign Key mit multiplem Ziel Java Persistence in Action - Features jenseits des Entry-Levels 15
  • 16. Polymorphe Assoziationen Nur Provider-abhängig möglich s. Demo-Klasse Employee etc. Annotation für Relationsattribut EclipseLink @VariableOneToOne Hibernate @Any, @AnyMetaData Java Persistence in Action - Features jenseits des Entry-Levels 16
  • 17. Custom Types Unnatürliche DB-Werte, z. B.: true  'J' false  'N' Provider- abhängiges Mapping s. Demo-Klasse Projekt Alternative: Life Cycle Methods Annotation EclipseLink @ObjectTypeConverter, @Converter Hibernate @Type OpenJPA @ExternalValues, @Type Java Persistence in Action - Features jenseits des Entry-Levels 17
  • 18. Custom Types Seit JPA 2.1: Converter @Converter public class JNConverter implements AttributeConverter<Boolean, String> { public String convertToDatabaseColumn(Boolean attributeValue) { if (attributeValue == null) return null; return attributeValue ? "J" : "N"; } public Boolean convertToEntityAttribute(String columnValue) { if (columnValue == null) return null; return columnValue.equals("J"); @Entity public class Projekt { @Convert(converter = JNConverter.class) private boolean aktiv; Java Persistence in Action - Features jenseits des Entry-Levels 18
  • 19. Packed Column Values Mehrere Werte in einer DB-Spalte @Entity public class Projekt { … private String projektTyp; Budget A Aufwand H Höchstpreis F Festpreis Tätigkeit 40 Beratung 60 Schulung 81 Programmierung 4 0F Java Persistence in Action - Features jenseits des Entry-Levels 19
  • 20. Packed Column Values (Un-)Boxing mittels Life Cycle Methods Nachteil: Query View  Class API @Entity public class Projekt { … private String projektTyp; @Transient private BudgetTyp budgetTyp; @Transient private Taetigkeit taetigkeit; @PrePersist @PreUpdate private void preStore() { projektTyp = budgetTyp.getKuerzel() + taetigkeit.getKuerzel(); } Java Persistence in Action - Features jenseits des Entry-Levels 20
  • 21. Fetch Tuning ToMany-Fetching: "N+1"-Problem z.B. Lesen der User inkl. Groups + Permissions SELECT ... FROM USER SELECT ... FROM USER_GROUP t0, GROUP t1 WHERE t0.USER_ID=? AND … SELECT ... FROM PERMISSION WHERE GROUP_ID=? SELECT ... FROM PERMISSION WHERE GROUP_ID=? SELECT ... FROM USER_GROUP t0, GROUP t1 WHERE t0.USER_ID=? AND … SELECT ... FROM USER_GROUP t0, GROUP t1 WHERE t0.USER_ID=? AND … Java Persistence in Action - Features jenseits des Entry-Levels 21
  • 22. Fetch Tuning Lösungsansatz 1: Join Fetching erzeugt 1 (!) SELECT Achtung: Volumen! CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<User> criteriaQuery = criteriaBuilder.createQuery(User.class); Root<User> u = criteriaQuery.from(User.class); u.fetch(User_.groups, JoinType.LEFT).fetch(Group_.permissions, JoinType.LEFT); criteriaQuery.select(u).distinct(true); List<User> users = entityManager.createQuery(criteriaQuery).getResultList(); Java Persistence in Action - Features jenseits des Entry-Levels 22
  • 23. Fetch Tuning Lösungsansatz 2: Batch Fetching erzeugt 1 SELECT pro 'Ebene' s. Demoklassen User etc. @ManyToMany(fetch = FetchType.LAZY, …) @BatchFetch(value = BatchFetchType.IN, size = 10) private Set<Group> groups; Annotation Relationsauflösung EclipseLink @BatchFetch IN, EXISTS, JOIN Hibernate @BatchSize IN, EXISTS OpenJPA @EagerFetchMode (nur für EAGER!) JOIN (='PARALLEL') Java Persistence in Action - Features jenseits des Entry-Levels 23
  • 24. Second Level Cache JPA 2.0 unterstützt 2nd Level Cache Wirkt applikationsweit Semantik ähnlich HashMap Ladereihenfolge: 1st Level Cache (EntityManager) 2nd Level Cache, falls enabled DB JPA Provider EntityManager 2nd Level Cache 1st Level Cache Java Persistence in Action - Features jenseits des Entry-Levels 24
  • 25. Second Level Cache Konfiguration <persistence-unit name="…"> <provider>…</provider> <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode> … Cache aktiv für … ALL alle Entities NONE keine Klasse ENABLE_SELECTIVE nur @Cacheable(true) DISABLE_SELECTIVE alle außer @Cacheable(false) @Entity @Cacheable(true) public class Land { … Java Persistence in Action - Features jenseits des Entry-Levels 25
  • 26. Second Level Cache Vorteil bei häufig genutzten (nahezu) konstanten Daten s. Demo-Klassen Kunde und Land Kunde Land 1 * Java Persistence in Action - Features jenseits des Entry-Levels 26
  • 27. Query Cache Providerspezifisch i. A. Teil des 2nd Level Cache Speichert Result Set IDs zu Queries Trotz mehrfacher Ausführung nur ein DB-Zugriff Java Persistence in Action - Features jenseits des Entry-Levels 27
  • 28. Query Cache Aktivierung durch Query Hints Map-Semantik Key = Query-Text + Parameter s. Demo-Klasse Land TypedQuery<Land> query = entityManager.createQuery(…, Land.class); query.setHint("eclipselink.cache-usage", "CheckCacheThenDatabase"); List<Land> laender = query.getResultList(); Java Persistence in Action - Features jenseits des Entry-Levels 28
  • 29. Fazit JPA out-of-the-box nur für "grüne Wiese" DB-Modelle mittlerer Komplexität Legacy-Anforderungen lösbar teilweise nur Provider-spezifisch Diverse "Stellschrauben" zur Optimierung teilweise nur Provider-spezifisch Java Persistence in Action - Features jenseits des Entry-Levels 29
  • 31. More http://www.gedoplan-it-training.de Seminare in Berlin, Bielefeld, Inhouse http://www.gedoplan-it-consulting.de Reviews, Coaching, … http://javaeeblog.wordpress.com/ http://expertenkreisjava.blogspot.de/  dirk.weil@gedoplan.de @dirkweil Java Persistence in Action - Features jenseits des Entry-Levels 31