Java Persistence API 2.0Expertenkreis Java, 24.06.2010Dirk Weil, GEDOPLAN GmbH
Warum JPA?Aufgabenstellung:Speichern und Laden vonJava-ObjektenMapping OO RDBMSpublic class Country{private String isoCode...
Warum JPA?Konventionelle LösungDirektes JDBCCountry country = new Country(...);…3…Connection connection = JdbcUtil.getConn...
Warum JPA?JPA-LösungNormale Java-Klasse (POJO)mit Annotationen@Entitypublic class Country{@Idprivate String isoCode;privat...
Warum JPA?Relationen (1:1, 1:n, n:m)@Entitypublic class Person{@Idpublic Integer id;@Entitypublic class MailAddress{@Idpub...
Warum JPA?Vererbungs-beziehungen@Entity@Inheritance(strategy=InheritanceType.JOINED)public abstract class Vehicle{@Idpriva...
Warum JPA?Anforderungen an O/R-MapperFeld-ZuordnungErstellen der SQL-BefehleID-Generierung7ID-GenerierungNavigation über R...
Entwicklung des Standards JPA1998199920002001EJB 1.0EJB 1.1JDO 1.0 Hibernate 18200120022003200420052006JPA 1.0EJB 2.1EJB 2...
Detached EntitiesManaged Entities können vom Entity Manager gelöst werdenmittels clear oder detachmittels rollbackdurch Sc...
Mapping-Annotationen und DefaultsConfiguration by Exception Meist gute Defaults vorhandenDennoch: Werte angebenTabellen- u...
QueriesAbfragesprache: JPQLÄhnlich SQL, jedoch objektorientiertJava-Interface: TypedQuery<E> (bis JPA 1.0 nur Query)Ausfüh...
Orphan Removal"Garbage Collection"für abhängige Objekte@Entitypublic class OrderLine{@Id@GeneratedValueprivate Integer id;...
Anordnung von RelationenelementenKann durch ein Feld der referenzierten Entity erzwungen werden@OneToMany(mappedBy = "orde...
Relationen als Id-Attribute (Derived Identity)Häufig bei zusammengesetzten SchlüsselnId-Attribut stellt Relation dar@Entit...
Collections von einfachen Typen oder einbettbaren ObjektenAttribute vom Typ Collection<E> oder davon abgeleitetEinfache El...
LockingProblemstellung:Gleiche Daten werdenparallel verändertUser A User B Some Entityreadreadupdate16Abhilfe:Optimistic L...
LockingPro Objekt anwendbarbeim Lesenfür bereits gelesene Objekteem.lock(someEntity,LockModeType.PESSIMISTIC_WRITE);17Lock...
Criteria QueriesProblem: Keine Korrektheitskontrolle von JPQL zur Compilezeit, z.B.falsche Schlüsselwörterunvollständige S...
Criteria Queries// "select c from Cocktail c where c.name=:name"CriteriaBuilder builder = em.getCriteriaBuilder();// Crite...
Statisches JPA-MetamodellMetamodell-Klasse E_ zu jeder persistenten Klasse E@Entitypublic class Cocktail{@Id@GeneratedValu...
Criteria Queries / Statisches JPA-Metamodell// "select c from Cocktail c where c.name=:name"CriteriaBuilder builder = em.g...
Weitere Neuerungen in JPA 2.0Zusätzliche Id-TypenExplizite Access TypesVerschachtelte EmbeddablesEmbeddables mit Relatione...
Mehr …im Java-Magazin 4.2010auch aufwww.gedoplan.de Veröffentlichungenin IPS-Seminarenoder: Fragen Sie!23
Upcoming SlideShare
Loading in …5
×

Java Persistence 2.0

214
-1

Published on

Vortrag Expertenkreis Java 24.6.2010

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
214
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Java Persistence 2.0

  1. 1. Java Persistence API 2.0Expertenkreis Java, 24.06.2010Dirk Weil, GEDOPLAN GmbH
  2. 2. Warum JPA?Aufgabenstellung:Speichern und Laden vonJava-ObjektenMapping OO RDBMSpublic class Country{private String isoCode;private String name;public Country(String isoCode,String description){...}2Mapping OO RDBMSLösungsansätze:JDBCEntity-EJBs (bis EJB 2.1)O/R-Mapper}public String getIsoCode(){return this.isoCode;}public void setIsoCode(String isoCode){this.isoCode = isoCode;}
  3. 3. Warum JPA?Konventionelle LösungDirektes JDBCCountry 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. 4. Warum JPA?JPA-LösungNormale Java-Klasse (POJO)mit Annotationen@Entitypublic class Country{@Idprivate String isoCode;private String name;…4Country country = new Country(...);…EntityManager em= entityManagerFactory.createEntityManager();EntityTransaction tx = em.getTransaction();tx.begin();em.persist(country);tx.commit();
  5. 5. Warum JPA?Relationen (1:1, 1:n, n:m)@Entitypublic class Person{@Idpublic Integer id;@Entitypublic class MailAddress{@Idpublic Integer id;1 n5public 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. 6. Warum JPA?Vererbungs-beziehungen@Entity@Inheritance(strategy=InheritanceType.JOINED)public abstract class Vehicle{@Idprivate Integer id;private String name;6@Entitypublic class Car extends Vehicle{private int noOfDoors;@Entitypublic class Ship extends Vehicle{private double tonnage;
  7. 7. Warum JPA?Anforderungen an O/R-MapperFeld-ZuordnungErstellen der SQL-BefehleID-Generierung7ID-GenerierungNavigation über RelationenAbbildung von VererbungVerwaltung kompletter Objekt-GraphenVerbindungsverwaltungTransaktionsverwaltungCachingSchemagenerierung
  8. 8. Entwicklung des Standards JPA1998199920002001EJB 1.0EJB 1.1JDO 1.0 Hibernate 18200120022003200420052006JPA 1.0EJB 2.1EJB 2.0EJB 3.0JDO 1.0JDO 1.0.1Hibernate 1Hibernate 2Hibernate 3200720082009JPA 2.0
  9. 9. Detached EntitiesManaged Entities können vom Entity Manager gelöst werdenmittels clear oder detachmittels rollbackdurch Schließen des Entity Managers9durch Schließen des Entity Managersdurch Serialisierung/DeserialisierungEntityManager em = …;String isoCode = "DE";Country country = em.find(Country.class, isoCode);em.detach(country);…
  10. 10. Mapping-Annotationen und DefaultsConfiguration by Exception Meist gute Defaults vorhandenDennoch: Werte angebenTabellen- und SpaltennamenZugriffstyp10Zugriffstyp…@Entity@Table(name="COUNTRY")@Access(AccessType.FIELD)public class Country{@Column(name="ISO_CODE")@Idprivate String isoCode;
  11. 11. QueriesAbfragesprache: JPQLÄhnlich SQL, jedoch objektorientiertJava-Interface: TypedQuery<E> (bis JPA 1.0 nur Query)Ausführung mit getSingleResult bzw. getResultList11Ausführung mit getSingleResult bzw. getResultListTypedQuery<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. 12. Orphan Removal"Garbage Collection"für abhängige Objekte@Entitypublic class OrderLine{@Id@GeneratedValueprivate Integer id;private String name;12@Entitypublic class Order{@Id@GeneratedValueprivate Integer id;@OneToMany(mappedBy = "order", orphanRemoval = true)private List<OrderLine> orderLines = new ArrayList<OrderLine>();private String name;private int count;@ManyToOneprivate Order order;
  13. 13. Anordnung von RelationenelementenKann 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 Spalte13@OneToMany(mappedBy = "order")@OrderColumn(name = "ORDERLINES_ORDER")private List<OrderLine> orderLines = new ArrayList<OrderLine>();
  14. 14. Relationen als Id-Attribute (Derived Identity)Häufig bei zusammengesetzten SchlüsselnId-Attribut stellt Relation dar@Entity@IdClass(ProjectId.class)public class ProjectIdimplements Serializable{public Integer department;14@IdClass(ProjectId.class)public class Project{@Id@ManyToOneprivate Department department;@Idprivate String prjId;…public Integer department;public String prjId;…
  15. 15. Collections von einfachen Typen oder einbettbaren ObjektenAttribute vom Typ Collection<E> oder davon abgeleitetEinfache Elementtypen oder Embeddables@Entitypublic class Employee{Abbildung auf Zusatztabelle15{…@ElementCollection(fetch = FetchType.EAGER)private List<String> skills = new ArrayList<String>();…
  16. 16. LockingProblemstellung:Gleiche Daten werdenparallel verändertUser A User B Some Entityreadreadupdate16Abhilfe:Optimistic Locking (mittels Versionsattribut)Pessimistic Locking (durch Sperren in der DB)updateupdate
  17. 17. LockingPro Objekt anwendbarbeim Lesenfür bereits gelesene Objekteem.lock(someEntity,LockModeType.PESSIMISTIC_WRITE);17LockModeType. BedeutungNONE Keine Sperren nutzenOPTIMISTIC Optimistic Locking benutzenOPTIMISTIC_FORCE_INCREMENT dito, aber mit Erhöhung des VersionsattributsPESSIMISTIC_READ Shared Lock benutzenPESSIMISTIC_WRITE Exclusive Lock benutzenPESSIMISTIC_FORCE_INCREMENT dito, aber mit Erhöhung des Versionsattributs
  18. 18. Criteria QueriesProblem: Keine Korrektheitskontrolle von JPQL zur Compilezeit, z.B.falsche Schlüsselwörterunvollständige Statementsfalsche Attributnamenselect c fron Cocktail cselect c from Cocktailfalsche AttributnamenTypkonflikteCriteria Query APIobjektorientiertstellt Vollständigkeit sichertypsicher18select c from Cocktail c where c.nam=:name
  19. 19. Criteria Queries// "select c from Cocktail c where c.name=:name"CriteriaBuilder builder = em.getCriteriaBuilder();// Criteria Query für Ergebnistyp erzeugenCriteriaQuery<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ügenPredicate hatNamen = builder.equal(c.get("name"), name);cQuery.where(hatNamen);// Query ausführenTypedQuery<Cocktail> q = em.createQuery(cQuery);List<Cocktail> found = q.getResultList();
  20. 20. Statisches JPA-MetamodellMetamodell-Klasse E_ zu jeder persistenten Klasse E@Entitypublic class Cocktail{@Id@GeneratedValue20@GeneratedValueprivate Integer id;private String name;@ManyToManyprivate 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. 21. Criteria Queries / Statisches JPA-Metamodell// "select c from Cocktail c where c.name=:name"CriteriaBuilder builder = em.getCriteriaBuilder();// Criteria Query für Ergebnistyp erzeugenCriteriaQuery<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ügenPredicate hatNamen = builder.equal(c.get(Cocktail_.name), name);cQuery.where(hatNamen);// Query ausführenTypedQuery<Cocktail> q = em.createQuery(cQuery);List<Cocktail> found = q.getResultList();
  22. 22. Weitere Neuerungen in JPA 2.0Zusätzliche Id-TypenExplizite Access TypesVerschachtelte EmbeddablesEmbeddables mit RelationenEmbeddables mit RelationenUnidirektionale 1:n-RelationenErweiterung von JPQLErmittelung des Load StateCaching…22
  23. 23. Mehr …im Java-Magazin 4.2010auch aufwww.gedoplan.de Veröffentlichungenin IPS-Seminarenoder: Fragen Sie!23
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×