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...
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...
Composite IDs
Basics:
@EmbeddedId
oder mehrere @Id
@Entity
public class SuperMarket
{
@EmbeddedId
private BranchId id;
@En...
Composite IDs
PK/FK-Überlappung
@Embeddable
public class EtageId
implements Serializable
{
@Column(name = "GEBAEUDE_ID")
p...
Composite IDs
PK/FK-Überlappung
public class FluegelId
implements Serializable
{
private Long gebaeude;
private String flu...
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({
@J...
Composite IDs
Mehrfach-Mapping auf gleiche Spalte
s. Demo-Klassen Flur und Raum
Nachteile:
Überlappende Relationsattribute...
Optimistic Locking
Standardverfahren:
Versionsattribut
setzt zusätzliche
Spalte voraus
@Entity
public class Person
{
@Vers...
Optimistic Locking
Providerabhängig weitere Verfahren
ohne explizite Versionsspalte
s. Demoklasse Person
verglichene
Spalt...
Inheritance
Mögliche Strategie SINGLE_TABLE
benötigt Diskriminator-Spalte
Vehicle
Car Ship
Lorry
Java Persistence in Actio...
Inheritance
Provider-abhängig auch ohne Diskriminator-Spalte
s. Demoklassen Vehicle etc.
Typ-Ermittlung für
gelesene Zeile...
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
Eclip...
Custom Types
Unnatürliche DB-Werte, z. B.:
true  'J'
false  'N'
Provider-
abhängiges
Mapping
s. Demo-Klasse Projekt
Alte...
Custom Types
Seit JPA 2.1:
Converter
@Converter
public class JNConverter implements AttributeConverter<Boolean, String> {
...
Packed Column Values
Mehrere Werte in einer DB-Spalte
@Entity
public class Projekt
{
…
private String projektTyp;
Budget
A...
Packed Column Values
(Un-)Boxing mittels Life Cycle Methods
Nachteil: Query View  Class API
@Entity
public class Projekt ...
Fetch Tuning
ToMany-Fetching: "N+1"-Problem
z.B. Lesen der User inkl. Groups + Permissions
SELECT ... FROM USER
SELECT ......
Fetch Tuning
Lösungsansatz 1: Join Fetching
erzeugt 1 (!) SELECT
Achtung: Volumen!
CriteriaBuilder criteriaBuilder = entit...
Fetch Tuning
Lösungsansatz 2: Batch Fetching
erzeugt 1 SELECT pro 'Ebene'
s. Demoklassen User etc.
@ManyToMany(fetch = Fet...
Second Level Cache
JPA 2.0 unterstützt 2nd Level Cache
Wirkt applikationsweit
Semantik ähnlich
HashMap
Ladereihenfolge:
1s...
Second Level Cache
Konfiguration
<persistence-unit name="…">
<provider>…</provider>
<shared-cache-mode>ENABLE_SELECTIVE</s...
Second Level Cache
Vorteil bei
häufig genutzten
(nahezu) konstanten
Daten
s. Demo-Klassen Kunde und Land
Kunde
Land
1
*
Ja...
Query Cache
Providerspezifisch
i. A. Teil des 2nd Level Cache
Speichert Result Set IDs zu Queries
Trotz mehrfacher Ausführ...
Query Cache
Aktivierung durch Query Hints
Map-Semantik
Key = Query-Text + Parameter
s. Demo-Klasse Land
TypedQuery<Land> q...
Fazit
JPA out-of-the-box nur für
"grüne Wiese"
DB-Modelle mittlerer Komplexität
Legacy-Anforderungen lösbar
teilweise nur ...
Präsentation / Demo-Projekt
http://de.slideshare.net/gedoplan/
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
https...
More
http://www.gedoplan-it-training.de
Seminare in Berlin, Bielefeld, Inhouse
http://www.gedoplan-it-consulting.de
Review...
Nächste SlideShare
Wird geladen in …5
×

javaPersistenceInActionFeaturesJenseitsDesEntryLevels

104 Aufrufe

Veröffentlicht am

Präsentation zum Vortrag "Java Persistence in Action - Features jenseits des Entry-Levels"

Veröffentlicht in: Software
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
104
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
16
Aktionen
Geteilt
0
Downloads
5
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie

javaPersistenceInActionFeaturesJenseitsDesEntryLevels

  1. 1. Java Persistence in Action Features jenseits des Entry-Levels Dirk Weil, GEDOPLAN GmbH
  2. 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. 3. ZEILEN Java Persistence in Action - Features jenseits des Entry-Levels 3
  4. 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. 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. 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. 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. 8. Composite IDs PK/FK-Überlappung Java Persistence in Action - Features jenseits des Entry-Levels 8
  9. 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. 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. 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. 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. 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. 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. 15. Polymorphe Assoziationen Foreign Key mit multiplem Ziel Java Persistence in Action - Features jenseits des Entry-Levels 15
  16. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  30. 30. 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
  31. 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

×