Java Persistence 2.0

  • 112 views
Uploaded on

Vortrag Expertenkreis Java 24.6.2010

Vortrag Expertenkreis Java 24.6.2010

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
112
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
6
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Java Persistence API 2.0Expertenkreis Java, 24.06.2010Dirk Weil, GEDOPLAN GmbH
  • 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. 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. 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. 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. 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. Warum JPA?Anforderungen an O/R-MapperFeld-ZuordnungErstellen der SQL-BefehleID-Generierung7ID-GenerierungNavigation über RelationenAbbildung von VererbungVerwaltung kompletter Objekt-GraphenVerbindungsverwaltungTransaktionsverwaltungCachingSchemagenerierung
  • 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. 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. 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. 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. 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. 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. 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. 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. LockingProblemstellung:Gleiche Daten werdenparallel verändertUser A User B Some Entityreadreadupdate16Abhilfe:Optimistic Locking (mittels Versionsattribut)Pessimistic Locking (durch Sperren in der DB)updateupdate
  • 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. 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. 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. 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. 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. 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. Mehr …im Java-Magazin 4.2010auch aufwww.gedoplan.de Veröffentlichungenin IPS-Seminarenoder: Fragen Sie!23