SlideShare ist ein Scribd-Unternehmen logo
Java Persistence API 2.0




Treffpunkt Semicolon, 27.04.2010, GFU Cyrus AG

Dirk Weil, GEDOPLAN GmbH
Warum JPA?                       public class Country
                                 {
                                   private String isoCode;
  Aufgabenstellung:                private String name;

     Speichern und Laden von       public Country(String isoCode,
                                                  String description)
     Java-Objekten                 {
     Mapping OO      RDBMS         ...
                                   }

                                   public String getIsoCode()
  Lösungsansätze:                  {
                                     return this.isoCode;
     JDBC                          }

     Entity-EJBs (bis EJB 2.1)     public void setIsoCode(String isoCode)
                                   {
     O/R-Mapper                      this.isoCode = isoCode;
                                   }




                                                                        2
Warum JPA?

  Konventionelle Lösung
     Direktes JDBC
      Country country = new Country(...);
      …
      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();
      …




                                                                   3
Warum JPA?                                   @Entity
                                             public class Country
                                             {
  JPA-Lösung                                   @Id
                                               private String isoCode;
     Normale Java-Klasse (POJO)                private String name;
     mit Annotationen                          …



      Country country = new Country(...);
      …
      EntityManager em
        = entityManagerFactory.createEntityManager();
      EntityTransaction tx = em.getTransaction();
      tx.begin();

      em.persist(country);

      tx.commit();




                                                                         4
Warum JPA?

  Relationen (1:1, 1:n, n:m)
  @Entity                                          @Entity
  public class Person                              public class MailAddress
  {                                                {
    @Id                                              @Id
    public Integer             id;           1 n     public Integer id;
    public String              name;                 public String userId;
                                                     public String domain;
    @OneToMany
    @JoinColumn(name = "PERSON_ID")
    public List<MailAddress> mailAddresses
      = new ArrayList<MailAddress>();




                                                                          5
Warum JPA?
                       @Entity

  Vererbungs-
                       @Inheritance(strategy=InheritanceType.JOINED)
                       public abstract class Vehicle
  beziehungen          {
                         @Id
                         private Integer id;
                         private String name;



          @Entity                                @Entity
          public class Car extends Vehicle       public class Ship extends Vehicle
          {                                      {
            private int noOfDoors;                 private double tonnage;




                                                                               6
Warum JPA?

  Anforderungen an O/R-Mapper
     Feld-Zuordnung
     Erstellen der SQL-Befehle
     ID-Generierung
     Navigation über Relationen
     Abbildung von Vererbung
     Verwaltung kompletter Objekt-Graphen
     Verbindungsverwaltung
     Transaktionsverwaltung
     Caching
     Schemagenerierung
                                            7
Entwicklung des Standards 'JPA'

    1998
              EJB 1.0
    1999
              EJB 1.1
    2000
    2001                           JDO 1.0     Hibernate 1
              EJB 2.0
    2002
    2003                           JDO 1.0.1   Hibernate 2
              EJB 2.1
    2004
    2005
              EJB 3.0    JPA 1.0               Hibernate 3
    2006
    2007
    2008
                         JPA 2.0
    2009


                                                             8
Detached Entities

  Managed Entities können vom Entity Manager gelöst werden
    mittels clear oder detach
    mittels rollback
    durch Schließen des Entity Managers
    durch Serialisierung/Deserialisierung
    EntityManager em = …;

    String isoCode = "DE";
    Country country = em.find(Country.class, isoCode);

    em.detach(country);

    …




                                                             9
Mapping-Annotationen und Defaults

  Configuration by Exception  Meist gute Defaults vorhanden
  Dennoch: Werte angeben
     Tabellen- und Spaltennamen
     Zugriffstyp
                                  @Entity
     …                            @Table(name="COUNTRY")
                                   @Access(AccessType.FIELD)
                                   public class Country
                                   {
                                     @Column(name="ISO_CODE")
                                     @Id
                                     private String isoCode;




                                                                10
Queries

  Abfragesprache: JPQL
  Ähnlich SQL, jedoch objektorientiert
  Java-Interface: TypedQuery<E> (bis JPA 1.0 nur Query)
  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();




                                                                          11
Orphan Removal

  "Garbage Collection"                           @Entity
  für abhängige Objekte                          public class OrderLine
                                                 {
                                                   @Id
                                                   @GeneratedValue
                                                   private Integer id;
                                                   private String name;
                                                   private int     count;
  @Entity
  public class Order                               @ManyToOne
  {                                                private Order   order;
    @Id
    @GeneratedValue
    private Integer        id;

    @OneToMany(mappedBy = "order", orphanRemoval = true)
    private List<OrderLine> orderLines = new ArrayList<OrderLine>();




                                                                       12
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
   @OneToMany(mappedBy = "order")
   @OrderColumn(name = "ORDERLINES_ORDER")
   private List<OrderLine> orderLines = new ArrayList<OrderLine>();




                                                                      13
Relationen als Id-Attribute (Derived Identity)

  Häufig bei zusammengesetzten Schlüsseln
  Id-Attribut stellt Relation dar
                                      public class ProjectId
                                        implements Serializable
   @Entity                            {
   @IdClass(ProjectId.class)            public Integer department;
   public class Project                 public String prjId;
   {                                    …
     @Id
     @ManyToOne
     private Department department;

     @Id
     private String    prjId;
     …




                                                                     14
Collections von einfachen Typen oder einbettbaren Objekten

  Attribute vom Typ Collection<E> oder davon abgeleitet
  Einfache Elementtypen oder Embeddables
   @Entity
   public class Employee
   {
     …
     @ElementCollection(fetch = FetchType.EAGER)
     private List<String> skills = new ArrayList<String>();
     …



  Abbildung auf Zusatztabelle




                                                              15
Locking
                            User A   User B                 Some Entity
  Problemstellung:
  Gleiche Daten werden
                                                     read
  parallel verändert
                                                  read
                                                 update


                                                 update




  Abhilfe:
     Optimistic Locking (mittels Versionsattribut)
     Pessimistic Locking (durch Sperren in der DB)

                                                                    16
Locking

  Pro Objekt anwendbar         em.lock(someEntity,
     beim Lesen                        LockModeType.PESSIMISTIC_WRITE);

     für bereits gelesene Objekte

   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


                                                                                     17
Criteria Queries

  Problem: Keine Korrektheitskontrolle von JPQL zur Compilezeit, z.B.
     falsche Schlüsselwörter                 select c fron Cocktail c

     unvollständige Statements
                                               select c from Cocktail
     falsche Attributnamen
     Typkonflikte          select c from Cocktail c where c.nam=:name



  Criteria Query API
      objektorientiert
      stellt Vollständigkeit sicher
      typsicher


                                                                   18
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)
 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();


                                                                         19
Statisches JPA-Metamodell

  Metamodell-Klasse E_ zu jeder persistenten Klasse E
  @Entity
  public class Cocktail
  {
    @Id
    @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;

                                                                       20
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)
 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();


                                                                         21
Weitere Neuerungen in JPA 2.0

  Zusätzliche Id-Typen
  Explizite Access Types
  Verschachtelte Embeddables
  Embeddables mit Relationen
  Unidirektionale 1:n-Relationen
  Erweiterung von JPQL
  Ermittelung des Load State
  Caching
  …



                                   22
Mehr …

  im Java-Magazin 4.2010
     Artikel ab Mitte Mai auch auf
     www.gedoplan.de

  in GFU-Seminaren



  oder: Fragen Sie!




                                     23

Weitere ähnliche Inhalte

Ähnlich wie Java Persistence 2.0

Optimierung von JPA-­Anwendungen
Optimierung von JPA-­AnwendungenOptimierung von JPA-­Anwendungen
Optimierung von JPA-­Anwendungen
hwilming
 
Java EE 5
Java EE 5Java EE 5
Java EE 5
GFU Cyrus AG
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
JPA the Versant Way
JPA the Versant WayJPA the Versant Way
JPA the Versant Wayjubecker
 
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
 
Codesmells
CodesmellsCodesmells
Codesmells
Hendrik Lösch
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
gedoplan
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
gedoplan
 
Typ-sichere DSLs
Typ-sichere DSLsTyp-sichere DSLs
Typ-sichere DSLs
Werner Keil
 
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-AnwendungenJava Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
gedoplan
 

Ähnlich wie Java Persistence 2.0 (10)

Optimierung von JPA-­Anwendungen
Optimierung von JPA-­AnwendungenOptimierung von JPA-­Anwendungen
Optimierung von JPA-­Anwendungen
 
Java EE 5
Java EE 5Java EE 5
Java EE 5
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
JPA the Versant Way
JPA the Versant WayJPA the Versant Way
JPA the Versant Way
 
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...
 
Codesmells
CodesmellsCodesmells
Codesmells
 
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevelsjavaPersistenceInActionFeaturesJenseitsDesEntryLevels
javaPersistenceInActionFeaturesJenseitsDesEntryLevels
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Typ-sichere DSLs
Typ-sichere DSLsTyp-sichere DSLs
Typ-sichere DSLs
 
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-AnwendungenJava Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
 

Mehr von GFU Cyrus AG

Social Media im Unternehmen
Social Media im UnternehmenSocial Media im Unternehmen
Social Media im Unternehmen
GFU Cyrus AG
 
Clean Code Developer
Clean Code DeveloperClean Code Developer
Clean Code Developer
GFU Cyrus AG
 
Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.
GFU Cyrus AG
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
GFU Cyrus AG
 
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
GFU Cyrus AG
 
Requirements Engineering in agilen Projekten - Flexibilität ist gefordert
Requirements Engineering in agilen Projekten - Flexibilität ist gefordertRequirements Engineering in agilen Projekten - Flexibilität ist gefordert
Requirements Engineering in agilen Projekten - Flexibilität ist gefordert
GFU Cyrus AG
 
SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!
GFU Cyrus AG
 
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
GFU Cyrus AG
 
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele UnternehmensanforderungenLiferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
GFU Cyrus AG
 
PostgreSQL im Produktivbetrieb
PostgreSQL im ProduktivbetriebPostgreSQL im Produktivbetrieb
PostgreSQL im Produktivbetrieb
GFU Cyrus AG
 
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
GFU Cyrus AG
 
Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?
GFU Cyrus AG
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
GFU Cyrus AG
 
Das Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der PraxisDas Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der Praxis
GFU Cyrus AG
 
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer SeminarverwaltungAgile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
GFU Cyrus AG
 
Wissensmanagement bei Volkswagen
Wissensmanagement bei VolkswagenWissensmanagement bei Volkswagen
Wissensmanagement bei Volkswagen
GFU Cyrus AG
 
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
GFU Cyrus AG
 
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalkGrenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
GFU Cyrus AG
 
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
GFU Cyrus AG
 
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
GFU Cyrus AG
 

Mehr von GFU Cyrus AG (20)

Social Media im Unternehmen
Social Media im UnternehmenSocial Media im Unternehmen
Social Media im Unternehmen
 
Clean Code Developer
Clean Code DeveloperClean Code Developer
Clean Code Developer
 
Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.Cross-Apps-Entwicklung für iPhone, Android und Co.
Cross-Apps-Entwicklung für iPhone, Android und Co.
 
Softwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration ToolsSoftwarequalitätssicherung mit Continuous Integration Tools
Softwarequalitätssicherung mit Continuous Integration Tools
 
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
Datenschutz bei Facebook & Co. - Wie schütze ich meine persönlichen Daten im ...
 
Requirements Engineering in agilen Projekten - Flexibilität ist gefordert
Requirements Engineering in agilen Projekten - Flexibilität ist gefordertRequirements Engineering in agilen Projekten - Flexibilität ist gefordert
Requirements Engineering in agilen Projekten - Flexibilität ist gefordert
 
SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!SharePoint 2010 - Was ist neu, was wird besser!
SharePoint 2010 - Was ist neu, was wird besser!
 
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
Pragmatische Einführung von IT-Servicemanagement - ITIL im Unternehmen - Erfa...
 
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele UnternehmensanforderungenLiferay Portal - ein Webportal für viele Unternehmensanforderungen
Liferay Portal - ein Webportal für viele Unternehmensanforderungen
 
PostgreSQL im Produktivbetrieb
PostgreSQL im ProduktivbetriebPostgreSQL im Produktivbetrieb
PostgreSQL im Produktivbetrieb
 
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
Java Server Faces 2.0 - Der Standard für moderne und komponentenbasierte Weba...
 
Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?Wieviel Web2.0 braucht Ihr Unternehmen?
Wieviel Web2.0 braucht Ihr Unternehmen?
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
Das Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der PraxisDas Java-Spring-Framework in der Praxis
Das Java-Spring-Framework in der Praxis
 
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer SeminarverwaltungAgile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
Agile Geschäftsprozeßanalyse OOA/D am Beispiel einer Seminarverwaltung
 
Wissensmanagement bei Volkswagen
Wissensmanagement bei VolkswagenWissensmanagement bei Volkswagen
Wissensmanagement bei Volkswagen
 
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
Professionelle Anforderungsanalyse am Beispiel einer Java-Anwendung zur Betri...
 
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalkGrenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
Grenzüberschreitende Geschäftsprozesse mit Microsoft SharePoint und BizTalk
 
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
Projekt! - Toll - Ein Anderer Macht`s! - Voraussetzungen für eine erfolgreich...
 
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
Standardsoftware in der Versicherungsbranche - Betrachtung eines Paradigmenwe...
 

Java Persistence 2.0

  • 1. Java Persistence API 2.0 Treffpunkt Semicolon, 27.04.2010, GFU Cyrus AG Dirk Weil, GEDOPLAN GmbH
  • 2. Warum JPA? public class Country { private String isoCode; Aufgabenstellung: private String name; Speichern und Laden von public Country(String isoCode, String description) Java-Objekten { Mapping OO RDBMS ... } public String getIsoCode() Lösungsansätze: { return this.isoCode; JDBC } Entity-EJBs (bis EJB 2.1) public void setIsoCode(String isoCode) { O/R-Mapper this.isoCode = isoCode; } 2
  • 3. Warum JPA? Konventionelle Lösung Direktes JDBC Country country = new Country(...); … 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(); … 3
  • 4. Warum JPA? @Entity public class Country { JPA-Lösung @Id private String isoCode; Normale Java-Klasse (POJO) private String name; mit Annotationen … Country country = new Country(...); … EntityManager em = entityManagerFactory.createEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.persist(country); tx.commit(); 4
  • 5. Warum JPA? Relationen (1:1, 1:n, n:m) @Entity @Entity public class Person public class MailAddress { { @Id @Id public Integer id; 1 n public Integer id; public String name; public String userId; public String domain; @OneToMany @JoinColumn(name = "PERSON_ID") public List<MailAddress> mailAddresses = new ArrayList<MailAddress>(); 5
  • 6. Warum JPA? @Entity Vererbungs- @Inheritance(strategy=InheritanceType.JOINED) public abstract class Vehicle beziehungen { @Id private Integer id; private String name; @Entity @Entity public class Car extends Vehicle public class Ship extends Vehicle { { private int noOfDoors; private double tonnage; 6
  • 7. Warum JPA? Anforderungen an O/R-Mapper Feld-Zuordnung Erstellen der SQL-Befehle ID-Generierung Navigation über Relationen Abbildung von Vererbung Verwaltung kompletter Objekt-Graphen Verbindungsverwaltung Transaktionsverwaltung Caching Schemagenerierung 7
  • 8. Entwicklung des Standards 'JPA' 1998 EJB 1.0 1999 EJB 1.1 2000 2001 JDO 1.0 Hibernate 1 EJB 2.0 2002 2003 JDO 1.0.1 Hibernate 2 EJB 2.1 2004 2005 EJB 3.0 JPA 1.0 Hibernate 3 2006 2007 2008 JPA 2.0 2009 8
  • 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 durch Serialisierung/Deserialisierung EntityManager em = …; String isoCode = "DE"; Country country = em.find(Country.class, isoCode); em.detach(country); … 9
  • 10. Mapping-Annotationen und Defaults Configuration by Exception Meist gute Defaults vorhanden Dennoch: Werte angeben Tabellen- und Spaltennamen Zugriffstyp @Entity … @Table(name="COUNTRY") @Access(AccessType.FIELD) public class Country { @Column(name="ISO_CODE") @Id private String isoCode; 10
  • 11. Queries Abfragesprache: JPQL Ähnlich SQL, jedoch objektorientiert Java-Interface: TypedQuery<E> (bis JPA 1.0 nur Query) 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(); 11
  • 12. Orphan Removal "Garbage Collection" @Entity für abhängige Objekte public class OrderLine { @Id @GeneratedValue private Integer id; private String name; private int count; @Entity public class Order @ManyToOne { private Order order; @Id @GeneratedValue private Integer id; @OneToMany(mappedBy = "order", orphanRemoval = true) private List<OrderLine> orderLines = new ArrayList<OrderLine>(); 12
  • 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 @OneToMany(mappedBy = "order") @OrderColumn(name = "ORDERLINES_ORDER") private List<OrderLine> orderLines = new ArrayList<OrderLine>(); 13
  • 14. Relationen als Id-Attribute (Derived Identity) Häufig bei zusammengesetzten Schlüsseln Id-Attribut stellt Relation dar public class ProjectId implements Serializable @Entity { @IdClass(ProjectId.class) public Integer department; public class Project public String prjId; { … @Id @ManyToOne private Department department; @Id private String prjId; … 14
  • 15. Collections von einfachen Typen oder einbettbaren Objekten Attribute vom Typ Collection<E> oder davon abgeleitet Einfache Elementtypen oder Embeddables @Entity public class Employee { … @ElementCollection(fetch = FetchType.EAGER) private List<String> skills = new ArrayList<String>(); … Abbildung auf Zusatztabelle 15
  • 16. Locking User A User B Some Entity Problemstellung: Gleiche Daten werden read parallel verändert read update update Abhilfe: Optimistic Locking (mittels Versionsattribut) Pessimistic Locking (durch Sperren in der DB) 16
  • 17. Locking Pro Objekt anwendbar em.lock(someEntity, beim Lesen LockModeType.PESSIMISTIC_WRITE); für bereits gelesene Objekte 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 17
  • 18. Criteria Queries Problem: Keine Korrektheitskontrolle von JPQL zur Compilezeit, z.B. falsche Schlüsselwörter select c fron Cocktail c unvollständige Statements select c from Cocktail falsche Attributnamen Typkonflikte select c from Cocktail c where c.nam=:name Criteria Query API objektorientiert stellt Vollständigkeit sicher typsicher 18
  • 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) 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(); 19
  • 20. Statisches JPA-Metamodell Metamodell-Klasse E_ zu jeder persistenten Klasse E @Entity public class Cocktail { @Id @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; 20
  • 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) 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(); 21
  • 22. Weitere Neuerungen in JPA 2.0 Zusätzliche Id-Typen Explizite Access Types Verschachtelte Embeddables Embeddables mit Relationen Unidirektionale 1:n-Relationen Erweiterung von JPQL Ermittelung des Load State Caching … 22
  • 23. Mehr … im Java-Magazin 4.2010 Artikel ab Mitte Mai auch auf www.gedoplan.de in GFU-Seminaren oder: Fragen Sie! 23