SlideShare una empresa de Scribd logo
1 de 23
Descargar para leer sin conexión
Java Persistence API 2.0
Expertenkreis Java, 24.06.2010
Dirk Weil, GEDOPLAN GmbH
Warum JPA?
Aufgabenstellung:
Speichern und Laden von
Java-Objekten
Mapping OO RDBMS
public class Country
{
private String isoCode;
private String name;
public Country(String isoCode,
String description)
{
...
}
2
Mapping OO RDBMS
Lösungsansätze:
JDBC
Entity-EJBs (bis EJB 2.1)
O/R-Mapper
}
public String getIsoCode()
{
return this.isoCode;
}
public void setIsoCode(String isoCode)
{
this.isoCode = isoCode;
}
Warum JPA?
Konventionelle Lösung
Direktes JDBC
Country country = new Country(...);
…
3
…
Connection connection = JdbcUtil.getConnection();
PreparedStatement statement = connection.prepareStatement(
"insert into Country(isoCode,name) values (?,?)");
statement.setString(1, country.getIsoCode());
statement.setString(2, country.getName());
statement.executeUpdate();
connection.commit();
…
Warum JPA?
JPA-Lösung
Normale Java-Klasse (POJO)
mit Annotationen
@Entity
public class Country
{
@Id
private String isoCode;
private String name;
…
4
Country country = new Country(...);
…
EntityManager em
= entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
tx.begin();
em.persist(country);
tx.commit();
Warum JPA?
Relationen (1:1, 1:n, n:m)
@Entity
public class Person
{
@Id
public Integer id;
@Entity
public class MailAddress
{
@Id
public Integer id;1 n
5
public Integer id;
public String name;
@OneToMany
@JoinColumn(name = "PERSON_ID")
public List<MailAddress> mailAddresses
= new ArrayList<MailAddress>();
public Integer id;
public String userId;
public String domain;
1 n
Warum JPA?
Vererbungs-
beziehungen
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public abstract class Vehicle
{
@Id
private Integer id;
private String name;
6
@Entity
public class Car extends Vehicle
{
private int noOfDoors;
@Entity
public class Ship extends Vehicle
{
private double tonnage;
Warum JPA?
Anforderungen an O/R-Mapper
Feld-Zuordnung
Erstellen der SQL-Befehle
ID-Generierung
7
ID-Generierung
Navigation über Relationen
Abbildung von Vererbung
Verwaltung kompletter Objekt-Graphen
Verbindungsverwaltung
Transaktionsverwaltung
Caching
Schemagenerierung
Entwicklung des Standards 'JPA'
1998
1999
2000
2001
EJB 1.0
EJB 1.1
JDO 1.0 Hibernate 1
8
2001
2002
2003
2004
2005
2006
JPA 1.0
EJB 2.1
EJB 2.0
EJB 3.0
JDO 1.0
JDO 1.0.1
Hibernate 1
Hibernate 2
Hibernate 3
2007
2008
2009
JPA 2.0
Detached Entities
Managed Entities können vom Entity Manager gelöst werden
mittels clear oder detach
mittels rollback
durch Schließen des Entity Managers
9
durch Schließen des Entity Managers
durch Serialisierung/Deserialisierung
EntityManager em = …;
String isoCode = "DE";
Country country = em.find(Country.class, isoCode);
em.detach(country);
…
Mapping-Annotationen und Defaults
Configuration by Exception Meist gute Defaults vorhanden
Dennoch: Werte angeben
Tabellen- und Spaltennamen
Zugriffstyp
10
Zugriffstyp
…
@Entity
@Table(name="COUNTRY")
@Access(AccessType.FIELD)
public class Country
{
@Column(name="ISO_CODE")
@Id
private String isoCode;
Queries
Abfragesprache: JPQL
Ähnlich SQL, jedoch objektorientiert
Java-Interface: TypedQuery<E> (bis JPA 1.0 nur Query)
Ausführung mit getSingleResult bzw. getResultList
11
Ausführung mit getSingleResult bzw. getResultList
TypedQuery<Country> query = em.createQuery(
"select c from Country c where c.carCode='D'", Country.class);
Country c = query.getSingleResult();
TypedQuery<Country> query = em.createQuery(
"select c from Country c where c.name like 'D%'", Country.class);
List<Country> l = query.getResultList();
Orphan Removal
"Garbage Collection"
für abhängige Objekte
@Entity
public class OrderLine
{
@Id
@GeneratedValue
private Integer id;
private String name;
12
@Entity
public class Order
{
@Id
@GeneratedValue
private Integer id;
@OneToMany(mappedBy = "order", orphanRemoval = true)
private List<OrderLine> orderLines = new ArrayList<OrderLine>();
private String name;
private int count;
@ManyToOne
private Order order;
Anordnung von Relationenelementen
Kann durch ein Feld der referenzierten Entity erzwungen werden
@OneToMany(mappedBy = "order")
@OrderBy("name")
private List<OrderLine> orderLines = new ArrayList<OrderLine>();
Alternative: Persistente Ordnung mittels zusätzlicher Spalte
13
@OneToMany(mappedBy = "order")
@OrderColumn(name = "ORDERLINES_ORDER")
private List<OrderLine> orderLines = new ArrayList<OrderLine>();
Relationen als Id-Attribute (Derived Identity)
Häufig bei zusammengesetzten Schlüsseln
Id-Attribut stellt Relation dar
@Entity
@IdClass(ProjectId.class)
public class ProjectId
implements Serializable
{
public Integer department;
14
@IdClass(ProjectId.class)
public class Project
{
@Id
@ManyToOne
private Department department;
@Id
private String prjId;
…
public Integer department;
public String prjId;
…
Collections von einfachen Typen oder einbettbaren Objekten
Attribute vom Typ Collection<E> oder davon abgeleitet
Einfache Elementtypen oder Embeddables
@Entity
public class Employee
{
Abbildung auf Zusatztabelle
15
{
…
@ElementCollection(fetch = FetchType.EAGER)
private List<String> skills = new ArrayList<String>();
…
Locking
Problemstellung:
Gleiche Daten werden
parallel verändert
User A User B Some Entity
read
read
update
16
Abhilfe:
Optimistic Locking (mittels Versionsattribut)
Pessimistic Locking (durch Sperren in der DB)
update
update
Locking
Pro Objekt anwendbar
beim Lesen
für bereits gelesene Objekte
em.lock(someEntity,
LockModeType.PESSIMISTIC_WRITE);
17
LockModeType. Bedeutung
NONE Keine Sperren nutzen
OPTIMISTIC Optimistic Locking benutzen
OPTIMISTIC_FORCE_INCREMENT dito, aber mit Erhöhung des Versionsattributs
PESSIMISTIC_READ Shared Lock benutzen
PESSIMISTIC_WRITE Exclusive Lock benutzen
PESSIMISTIC_FORCE_INCREMENT dito, aber mit Erhöhung des Versionsattributs
Criteria Queries
Problem: Keine Korrektheitskontrolle von JPQL zur Compilezeit, z.B.
falsche Schlüsselwörter
unvollständige Statements
falsche Attributnamen
select c fron Cocktail c
select c from Cocktail
falsche Attributnamen
Typkonflikte
Criteria Query API
objektorientiert
stellt Vollständigkeit sicher
typsicher
18
select c from Cocktail c where c.nam=:name
Criteria Queries
// "select c from Cocktail c where c.name=:name"
CriteriaBuilder builder = em.getCriteriaBuilder();
// Criteria Query für Ergebnistyp erzeugen
CriteriaQuery<Cocktail> cQuery = builder.createQuery(Cocktail.class);
// Projektionsvariablen erzeugen (FROM-Klausel)
19
// Projektionsvariablen erzeugen (FROM-Klausel)
Root<Cocktail> c = cQuery.from(Cocktail.class);
// Selektion angeben (SELECT-Klausel)
cQuery.select(c);
// Bedingung erstellen und der Query hinzufügen
Predicate hatNamen = builder.equal(c.get("name"), name);
cQuery.where(hatNamen);
// Query ausführen
TypedQuery<Cocktail> q = em.createQuery(cQuery);
List<Cocktail> found = q.getResultList();
Statisches JPA-Metamodell
Metamodell-Klasse E_ zu jeder persistenten Klasse E
@Entity
public class Cocktail
{
@Id
@GeneratedValue
20
@GeneratedValue
private Integer id;
private String name;
@ManyToMany
private Set<Zutat> zutaten = new HashSet<Zutat>();
@StaticMetamodel(Cocktail.class)
public abstract class Cocktail_
{
public static volatile SingularAttribute<Cocktail, Integer> id;
public static volatile SingularAttribute<Cocktail, String> name;
public static volatile SetAttribute<Cocktail, Zutat> zutaten;
Criteria Queries / Statisches JPA-Metamodell
// "select c from Cocktail c where c.name=:name"
CriteriaBuilder builder = em.getCriteriaBuilder();
// Criteria Query für Ergebnistyp erzeugen
CriteriaQuery<Cocktail> cQuery = builder.createQuery(Cocktail.class);
// Projektionsvariablen erzeugen (FROM-Klausel)
21
// Projektionsvariablen erzeugen (FROM-Klausel)
Root<Cocktail> c = cQuery.from(Cocktail.class);
// Selektion angeben (SELECT-Klausel)
cQuery.select(c);
// Bedingung erstellen und der Query hinzufügen
Predicate hatNamen = builder.equal(c.get(Cocktail_.name), name);
cQuery.where(hatNamen);
// Query ausführen
TypedQuery<Cocktail> q = em.createQuery(cQuery);
List<Cocktail> found = q.getResultList();
Weitere Neuerungen in JPA 2.0
Zusätzliche Id-Typen
Explizite Access Types
Verschachtelte Embeddables
Embeddables mit RelationenEmbeddables mit Relationen
Unidirektionale 1:n-Relationen
Erweiterung von JPQL
Ermittelung des Load State
Caching
…
22
Mehr …
im Java-Magazin 4.2010
auch auf
www.gedoplan.de Veröffentlichungen
in IPS-Seminaren
oder: Fragen Sie!
23

Más contenido relacionado

Similar a Java Persistence 2.0

Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...GFU Cyrus AG
 
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015Manfred Steyer
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
Datenbankoptimierung für Ruby on Rails
Datenbankoptimierung für Ruby on RailsDatenbankoptimierung für Ruby on Rails
Datenbankoptimierung für Ruby on RailsKarsten Meier
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsgedoplan
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Open icf (open identity connector framework) @ forgerock deutsch
Open icf (open identity connector framework) @ forgerock   deutschOpen icf (open identity connector framework) @ forgerock   deutsch
Open icf (open identity connector framework) @ forgerock deutschHanns Nolan
 
JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)Michael Kurz
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7msebel
 
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeSOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeMario Rodler
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...gedoplan
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6GFU Cyrus AG
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)Uwe Printz
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererUwe Printz
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101gueste4be40
 
31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn
31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn
31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn.NET User Group Rhein-Neckar
 
Einführung React Native
Einführung React NativeEinführung React Native
Einführung React NativeMarkus Günther
 

Similar a Java Persistence 2.0 (20)

Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
Überblick zu EF7 auf DevCon der Fox-Pro-Usergroup in Frankfurt, Nov 2015
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Codesmells
CodesmellsCodesmells
Codesmells
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Datenbankoptimierung für Ruby on Rails
Datenbankoptimierung für Ruby on RailsDatenbankoptimierung für Ruby on Rails
Datenbankoptimierung für Ruby on Rails
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Open icf (open identity connector framework) @ forgerock deutsch
Open icf (open identity connector framework) @ forgerock   deutschOpen icf (open identity connector framework) @ forgerock   deutsch
Open icf (open identity connector framework) @ forgerock deutsch
 
JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)JSF und JPA effizient kombinieren (W-JAX 2011)
JSF und JPA effizient kombinieren (W-JAX 2011)
 
Prototype 1.7
Prototype 1.7Prototype 1.7
Prototype 1.7
 
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter SystemeSOLID Prinzipien, Designgrundlagen objektorientierter Systeme
SOLID Prinzipien, Designgrundlagen objektorientierter Systeme
 
Tutorium 4
Tutorium 4Tutorium 4
Tutorium 4
 
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
Das Runde muss in das Eckige - Java-Anwendungen für Kubernetes entwickeln und...
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
 
2009 03 17 Spring101
2009 03 17 Spring1012009 03 17 Spring101
2009 03 17 Spring101
 
31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn
31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn
31. Teffen der .NET User Group Rhein-Neckar mit Robin Sedlaczek - SpeakRoslyn
 
Einführung React Native
Einführung React NativeEinführung React Native
Einführung React Native
 

Java Persistence 2.0

  • 1. Java Persistence API 2.0 Expertenkreis Java, 24.06.2010 Dirk Weil, GEDOPLAN GmbH
  • 2. Warum JPA? Aufgabenstellung: Speichern und Laden von Java-Objekten Mapping OO RDBMS public class Country { private String isoCode; private String name; public Country(String isoCode, String description) { ... } 2 Mapping OO RDBMS Lösungsansätze: JDBC Entity-EJBs (bis EJB 2.1) O/R-Mapper } public String getIsoCode() { return this.isoCode; } public void setIsoCode(String isoCode) { this.isoCode = isoCode; }
  • 3. Warum JPA? Konventionelle Lösung Direktes JDBC Country country = new Country(...); … 3 … Connection connection = JdbcUtil.getConnection(); PreparedStatement statement = connection.prepareStatement( "insert into Country(isoCode,name) values (?,?)"); statement.setString(1, country.getIsoCode()); statement.setString(2, country.getName()); statement.executeUpdate(); connection.commit(); …
  • 4. Warum JPA? JPA-Lösung Normale Java-Klasse (POJO) mit Annotationen @Entity public class Country { @Id private String isoCode; private String name; … 4 Country country = new Country(...); … EntityManager em = entityManagerFactory.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(country); tx.commit();
  • 5. Warum JPA? Relationen (1:1, 1:n, n:m) @Entity public class Person { @Id public Integer id; @Entity public class MailAddress { @Id public Integer id;1 n 5 public Integer id; public String name; @OneToMany @JoinColumn(name = "PERSON_ID") public List<MailAddress> mailAddresses = new ArrayList<MailAddress>(); public Integer id; public String userId; public String domain; 1 n
  • 6. Warum JPA? Vererbungs- beziehungen @Entity @Inheritance(strategy=InheritanceType.JOINED) public abstract class Vehicle { @Id private Integer id; private String name; 6 @Entity public class Car extends Vehicle { private int noOfDoors; @Entity public class Ship extends Vehicle { private double tonnage;
  • 7. Warum JPA? Anforderungen an O/R-Mapper Feld-Zuordnung Erstellen der SQL-Befehle ID-Generierung 7 ID-Generierung Navigation über Relationen Abbildung von Vererbung Verwaltung kompletter Objekt-Graphen Verbindungsverwaltung Transaktionsverwaltung Caching Schemagenerierung
  • 8. Entwicklung des Standards 'JPA' 1998 1999 2000 2001 EJB 1.0 EJB 1.1 JDO 1.0 Hibernate 1 8 2001 2002 2003 2004 2005 2006 JPA 1.0 EJB 2.1 EJB 2.0 EJB 3.0 JDO 1.0 JDO 1.0.1 Hibernate 1 Hibernate 2 Hibernate 3 2007 2008 2009 JPA 2.0
  • 9. Detached Entities Managed Entities können vom Entity Manager gelöst werden mittels clear oder detach mittels rollback durch Schließen des Entity Managers 9 durch Schließen des Entity Managers durch Serialisierung/Deserialisierung EntityManager em = …; String isoCode = "DE"; Country country = em.find(Country.class, isoCode); em.detach(country); …
  • 10. Mapping-Annotationen und Defaults Configuration by Exception Meist gute Defaults vorhanden Dennoch: Werte angeben Tabellen- und Spaltennamen Zugriffstyp 10 Zugriffstyp … @Entity @Table(name="COUNTRY") @Access(AccessType.FIELD) public class Country { @Column(name="ISO_CODE") @Id private String isoCode;
  • 11. Queries Abfragesprache: JPQL Ähnlich SQL, jedoch objektorientiert Java-Interface: TypedQuery<E> (bis JPA 1.0 nur Query) Ausführung mit getSingleResult bzw. getResultList 11 Ausführung mit getSingleResult bzw. getResultList TypedQuery<Country> query = em.createQuery( "select c from Country c where c.carCode='D'", Country.class); Country c = query.getSingleResult(); TypedQuery<Country> query = em.createQuery( "select c from Country c where c.name like 'D%'", Country.class); List<Country> l = query.getResultList();
  • 12. Orphan Removal "Garbage Collection" für abhängige Objekte @Entity public class OrderLine { @Id @GeneratedValue private Integer id; private String name; 12 @Entity public class Order { @Id @GeneratedValue private Integer id; @OneToMany(mappedBy = "order", orphanRemoval = true) private List<OrderLine> orderLines = new ArrayList<OrderLine>(); private String name; private int count; @ManyToOne private Order order;
  • 13. Anordnung von Relationenelementen Kann durch ein Feld der referenzierten Entity erzwungen werden @OneToMany(mappedBy = "order") @OrderBy("name") private List<OrderLine> orderLines = new ArrayList<OrderLine>(); Alternative: Persistente Ordnung mittels zusätzlicher Spalte 13 @OneToMany(mappedBy = "order") @OrderColumn(name = "ORDERLINES_ORDER") private List<OrderLine> orderLines = new ArrayList<OrderLine>();
  • 14. Relationen als Id-Attribute (Derived Identity) Häufig bei zusammengesetzten Schlüsseln Id-Attribut stellt Relation dar @Entity @IdClass(ProjectId.class) public class ProjectId implements Serializable { public Integer department; 14 @IdClass(ProjectId.class) public class Project { @Id @ManyToOne private Department department; @Id private String prjId; … public Integer department; public String prjId; …
  • 15. Collections von einfachen Typen oder einbettbaren Objekten Attribute vom Typ Collection<E> oder davon abgeleitet Einfache Elementtypen oder Embeddables @Entity public class Employee { Abbildung auf Zusatztabelle 15 { … @ElementCollection(fetch = FetchType.EAGER) private List<String> skills = new ArrayList<String>(); …
  • 16. Locking Problemstellung: Gleiche Daten werden parallel verändert User A User B Some Entity read read update 16 Abhilfe: Optimistic Locking (mittels Versionsattribut) Pessimistic Locking (durch Sperren in der DB) update update
  • 17. Locking Pro Objekt anwendbar beim Lesen für bereits gelesene Objekte em.lock(someEntity, LockModeType.PESSIMISTIC_WRITE); 17 LockModeType. Bedeutung NONE Keine Sperren nutzen OPTIMISTIC Optimistic Locking benutzen OPTIMISTIC_FORCE_INCREMENT dito, aber mit Erhöhung des Versionsattributs PESSIMISTIC_READ Shared Lock benutzen PESSIMISTIC_WRITE Exclusive Lock benutzen PESSIMISTIC_FORCE_INCREMENT dito, aber mit Erhöhung des Versionsattributs
  • 18. Criteria Queries Problem: Keine Korrektheitskontrolle von JPQL zur Compilezeit, z.B. falsche Schlüsselwörter unvollständige Statements falsche Attributnamen select c fron Cocktail c select c from Cocktail falsche Attributnamen Typkonflikte Criteria Query API objektorientiert stellt Vollständigkeit sicher typsicher 18 select c from Cocktail c where c.nam=:name
  • 19. Criteria Queries // "select c from Cocktail c where c.name=:name" CriteriaBuilder builder = em.getCriteriaBuilder(); // Criteria Query für Ergebnistyp erzeugen CriteriaQuery<Cocktail> cQuery = builder.createQuery(Cocktail.class); // Projektionsvariablen erzeugen (FROM-Klausel) 19 // Projektionsvariablen erzeugen (FROM-Klausel) Root<Cocktail> c = cQuery.from(Cocktail.class); // Selektion angeben (SELECT-Klausel) cQuery.select(c); // Bedingung erstellen und der Query hinzufügen Predicate hatNamen = builder.equal(c.get("name"), name); cQuery.where(hatNamen); // Query ausführen TypedQuery<Cocktail> q = em.createQuery(cQuery); List<Cocktail> found = q.getResultList();
  • 20. Statisches JPA-Metamodell Metamodell-Klasse E_ zu jeder persistenten Klasse E @Entity public class Cocktail { @Id @GeneratedValue 20 @GeneratedValue private Integer id; private String name; @ManyToMany private Set<Zutat> zutaten = new HashSet<Zutat>(); @StaticMetamodel(Cocktail.class) public abstract class Cocktail_ { public static volatile SingularAttribute<Cocktail, Integer> id; public static volatile SingularAttribute<Cocktail, String> name; public static volatile SetAttribute<Cocktail, Zutat> zutaten;
  • 21. Criteria Queries / Statisches JPA-Metamodell // "select c from Cocktail c where c.name=:name" CriteriaBuilder builder = em.getCriteriaBuilder(); // Criteria Query für Ergebnistyp erzeugen CriteriaQuery<Cocktail> cQuery = builder.createQuery(Cocktail.class); // Projektionsvariablen erzeugen (FROM-Klausel) 21 // Projektionsvariablen erzeugen (FROM-Klausel) Root<Cocktail> c = cQuery.from(Cocktail.class); // Selektion angeben (SELECT-Klausel) cQuery.select(c); // Bedingung erstellen und der Query hinzufügen Predicate hatNamen = builder.equal(c.get(Cocktail_.name), name); cQuery.where(hatNamen); // Query ausführen TypedQuery<Cocktail> q = em.createQuery(cQuery); List<Cocktail> found = q.getResultList();
  • 22. Weitere Neuerungen in JPA 2.0 Zusätzliche Id-Typen Explizite Access Types Verschachtelte Embeddables Embeddables mit RelationenEmbeddables mit Relationen Unidirektionale 1:n-Relationen Erweiterung von JPQL Ermittelung des Load State Caching … 22
  • 23. Mehr … im Java-Magazin 4.2010 auch auf www.gedoplan.de Veröffentlichungen in IPS-Seminaren oder: Fragen Sie! 23