Java Persistence       Standard meets RealityArne Limburg // open knowledge GmbH
JPA 2.0    The technical objective of this work isto provide an object/relational mapping facility        for the Java app...
Agenda            JPA Core          EE Integration         Wolkige Zukunft?
Persistenz in Java EE Am Anfang war die  JDBC-API…                  Image: digitalart / FreeDigitalPhotos.net
Persistenz in Java EEErster Versuch:- Bean-Managed PersistenceZweiter Versuch:- Container-Managed PersistenceParallel: JDO...
Persistenz in Java EE     Schon besser: CMP 2Open Source auf der Überholspur:   Castor, IBatis, Hibernate     Ein Neubegin...
JPA aus 10.000 Metern
EmbeddableEntityListener           EntityManagerFactory                         Query           EntityManagerEntityTransac...
Eine JPA Entität@Entity @Table(name = "TAB_USER")public class User {    @Id @Column(name = "USER_ID")    private int id;  ...
Ab JPA 2.1: Custom Converter  @Entity @Table(name = "TAB_USER")  public class User {      @Id @Column(name = "USER_ID")   ...
Herausforderungen         Beziehungen         Granularität         Vererbung                        Image: scottchan / Fre...
Beziehungen – many-to-one @Entity public class User {     @ManyToOne     @JoinColumn(name = "ROLE_ID")     private Role ro...
Beziehungen - Bidirektional @Entity public class Role {     @OneToMany(mappedBy = "role")     private List<User> users;   ...
Beziehungen – one-to-one@Entitypublic class User {    @OneToOne    @JoinColumn(name = "ROLE_ID")    private Role role;    …}
Beziehungen – geteilte Id@Entitypublic class Role {    @Id    @OneToOne    private User user;    …}
Beziehungen – many-to-many  @Entity  public class User {      @ManyToMany      @JoinTable(name = "TAB_USER_ROLES",        ...
Beziehungen – owning side @Entity public class Role {     @ManyToMany(mappedBy = "roles")     private List<User> users;   ...
Herausforderungen         Beziehungen         Granularität         Vererbung                        Image: scottchan / Fre...
Granularität - Embeddables @Entity public class User {     @Embedded @AttributeOverride(…)     private Role role;     … } ...
Granularität - ElementCollection   @Entity   public class User {       @ElementCollection       @CollectionTable(name = "…...
Granularität – Simple Values @Entity public class User {     @ElementCollection     @CollectionTable(name = "…",          ...
Herausforderungen         Beziehungen         Granularität         Vererbung                        Image: scottchan / Fre...
Vererbung – Single Table@Entity@Inheritance(strategy = SINGLE_TABLE)@DiscriminatorColumn(name = "…")public class User {  …...
Vererbung – Table per Class @Entity @Inheritance(strategy = TABLE_PER_CLASS) public class User {   … } @Entity public clas...
Vererbung – Joined@Entity@Inheritance(strategy = JOINED)public class User {  …}@Entitypublic class Admin extends User {   ...
Vererbung – Secondary Table  @Entity  @Inheritance(strategy = JOINED)  public class User {    …  }  @Entity @SecondaryTabl...
Vererbung – Mapped Superclass   @MappedSuperclass   public class AbstractUser {     …   }
Agenda            JPA Core          EE Integration         Wolkige Zukunft?
Entity-Lebenszyklus                      EE IntegrationIntegration mit EJBIntegration mit CDI
Entity-Lebenszyklus           New                  Removed                           entityManager.remove  entityManager.p...
Entity-Lebenszyklus           New                     Removed                            Achtung:                         ...
Wann wird der EntityManager  eigentlich geschlossen?
Fragestellungen• EntityManager  – Container- vs. Application-Managed  – Transactional vs. Extended• Transaction  – JTA vs....
Application-Managed• Erzeugung via entityManagerFactory.createEntityManager(…)• Transaktionsbehandlung (Manuell)  – JTA en...
Application-Managed• Erzeugung via entityManagerFactory.createEntityManager(…)• Transaktionsbehandlung (Manuell)          ...
Entity-Lebenszyklus                      EE IntegrationIntegration mit EJBIntegration mit CDI
EE IntegrationIntegration mit EJB
Transaction-Scoped@Statelesspublic class UserDaoEjb {    @PersistenceContext    private EntityManager em;    …    public v...
Transaction-Scoped@Statelesspublic class UserDaoEjb {    @PersistenceContext    private EntityManager em;    …    @Transac...
Java-EE-5-Schichtenarchitektur                    Vorsicht mit Lazy-Transaktions-             Initializationgrenze
Session-Scoped@Statefulpublic class UserDaoEjb {    @PersistenceContext(type = EXTENDED)    private EntityManager em;    …...
Session-Scoped@Statefulpublic class UserDaoEjb {    @PersistenceContext(type = EXTENDED)    private EntityManager em;    …...
Unsynchronized (ab JPA 2.1) @Stateful public class UserDaoEjb {     @PersistenceContext(         synchronization = UNSYNCH...
Unsynchronized (ab JPA 2.1) @Stateful public class UserDaoEjb {     @PersistenceContext(         synchronization = UNSYNCH...
Producer für CDI@Statelesspublic class UserServiceEjb {    @Produces @PersistenceContext    private EntityManager em;    …...
Fazit EJB-Integration• Injection in Session Beans  (stateful und stateless)• Transaktionsgrenze  – Methodenaufruf der Sess...
EE IntegrationIntegration mit EJB
EE IntegrationIntegration mit CDI
Integration mit CDI (ab JPA 2.1)   public class MyEntityListener {       @Inject @Current       private User user;       @...
Integration mit CDI (ab JPA 2.1)   public class MyEntityListener {       @Inject @CurrentAchtung:       private User user;...
Integration mit CDIaußerhalb des Standards  CDI bietet viele Scopes und ausgefeiltes          Lifecycle-Management!   Kann...
Request-Scoped EntityManager @ApplicationScoped public class MyPersistenceUnit {     @Produces     @RequestScoped     publ...
Lifecycle-Management von CDI @ApplicationScoped public class MyPersistenceUnit {     …     public void closeEntityManager(...
Schichtenarchitektur mit CDIEntityManager           Lazy-Initializationlifecycle                         möglich
Schichtenarchitektur mit CDIEntityManager                        Lazy-Initializationlifecycle                             ...
Transactional-Interceptor mit CDI  @Transactional @Interceptor  public class MyTransactionalInterceptor {      @Inject    ...
Transactional-Interceptor mit CDI  @InterceptorBinding  public @interface Transactional {  }
Transactional-Interceptor mit CDI  @Transactional @Interceptor  public class MyTransactionalInterceptor {      @Inject    ...
Transactional-Interceptor mit CDI   …   @AroundInvoke   public Object startTransaction(        InvocationContext context) ...
Transactional-Interceptor mit CDI  @ApplicationScoped  public class MyUserDao {      @Inject      private EntityManager em...
Weitere Scopes?@ApplicationScopedpublic class MyPersistenceUnit {    @Produces    @RequestScoped    public EntityManager c...
Conversation-Scope?@ApplicationScopedpublic class MyPersistenceUnit {    @Produces    @ConversationScoped    public Entity...
Custom Scope@ApplicationScopedpublic class MyPersistenceUnit {    @Produces    @MyCustomScoped    public EntityManager cre...
Agenda            JPA Core          EE Integration         Wolkige Zukunft?
Mandantenfähigkeit                     Wolkige Zukunft? JPA und NoSQL
Mandantenfähigkeit                     Wolkige Zukunft?
Mandantenfähigkeit in JPA 2.1• Ein Mandant pro Applikation• Drei Strategien des Datenzugriffs  – SEPARATE_DATABASE  – SEPA...
Mandantenfähigkeit                     Wolkige Zukunft? JPA und NoSQL
Wolkige Zukunft?JPA und NoSQL
NoSQL – „Not only SQL“• Nicht relational• Distributed• Big Data• Eventually Consistent  statt ACID• Map-Reduce statt SQL
Varianten• Key-Value  – SimpleDB, Infinispan, Coherence, …• Wide-Column  – BigTable, Cassandra, …• Document-Databases  – M...
Abfragemöglichkeiten• Nach Primärschlüssel• SQL-like Abfragesprache (z.B.  SimpleDB)• Map-Reduce• …Joins sind teuer!
Wie passt das   zu JPA?
Fokus von JPA auf RDBMS•   Id-Generierungsstrategien•   Joins•   Subclassing•   Polymorphie•   Transaktionen
Vision• Trennung von  – Mapping (@Entity, @Id)  – Relationale Spezifika    (@Table, @Column)?• Querying• Transaktions-Beha...
Stand der DingeImplementierungen• SimpleJPA (SimpleDB)• Datanucleus-appengine  (BigTable)• Hibernate-OGM  (Infinispan, Mon...
FazitCloud Computing in Java EE• in Java EE 7  – Mandantenfähigkeit  – JSR 347: Data Grids for the Java Platform• In Java ...
FazitCloud Computing• in Java EEJPA in der Cloud gibt es!             7   – Mandantenfähigkeit den JPA-Standard ist       ...
Q&AVielen Dank für Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 Oldenburgarne.limburg@openknowledge.de     Ar...
Java Persistence - Standard meets Reality
Upcoming SlideShare
Loading in...5
×

Java Persistence - Standard meets Reality

1,225

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,225
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
26
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Java Persistence - Standard meets Reality

  1. 1. Java Persistence Standard meets RealityArne Limburg // open knowledge GmbH
  2. 2. JPA 2.0 The technical objective of this work isto provide an object/relational mapping facility for the Java application developer using a Java domain model to manage a relational database. Zitat: JPA Spezifikation, v 2.0
  3. 3. Agenda JPA Core EE Integration Wolkige Zukunft?
  4. 4. Persistenz in Java EE Am Anfang war die JDBC-API… Image: digitalart / FreeDigitalPhotos.net
  5. 5. Persistenz in Java EEErster Versuch:- Bean-Managed PersistenceZweiter Versuch:- Container-Managed PersistenceParallel: JDO Image: digitalart / FreeDigitalPhotos.net
  6. 6. Persistenz in Java EE Schon besser: CMP 2Open Source auf der Überholspur: Castor, IBatis, Hibernate Ein Neubeginn: JPA Image: digitalart / FreeDigitalPhotos.net
  7. 7. JPA aus 10.000 Metern
  8. 8. EmbeddableEntityListener EntityManagerFactory Query EntityManagerEntityTransaction Entity Building Blocks Cache CriteriaQuery MappedSuperclass
  9. 9. Eine JPA Entität@Entity @Table(name = "TAB_USER")public class User { @Id @Column(name = "USER_ID") private int id; …}
  10. 10. Ab JPA 2.1: Custom Converter @Entity @Table(name = "TAB_USER") public class User { @Id @Column(name = "USER_ID") private int id; @Convert(converter = MyConverter.class) private X509Certificate certificate; … }
  11. 11. Herausforderungen Beziehungen Granularität Vererbung Image: scottchan / FreeDigitalPhotos.net
  12. 12. Beziehungen – many-to-one @Entity public class User { @ManyToOne @JoinColumn(name = "ROLE_ID") private Role role; … }
  13. 13. Beziehungen - Bidirektional @Entity public class Role { @OneToMany(mappedBy = "role") private List<User> users; … }
  14. 14. Beziehungen – one-to-one@Entitypublic class User { @OneToOne @JoinColumn(name = "ROLE_ID") private Role role; …}
  15. 15. Beziehungen – geteilte Id@Entitypublic class Role { @Id @OneToOne private User user; …}
  16. 16. Beziehungen – many-to-many @Entity public class User { @ManyToMany @JoinTable(name = "TAB_USER_ROLES", joinColumns = …, inverseJoinColumns = …) private List<Role> roles; … }
  17. 17. Beziehungen – owning side @Entity public class Role { @ManyToMany(mappedBy = "roles") private List<User> users; … }
  18. 18. Herausforderungen Beziehungen Granularität Vererbung Image: scottchan / FreeDigitalPhotos.net
  19. 19. Granularität - Embeddables @Entity public class User { @Embedded @AttributeOverride(…) private Role role; … } @Embeddable public class Role { … }
  20. 20. Granularität - ElementCollection @Entity public class User { @ElementCollection @CollectionTable(name = "…", joinColumns = …) private List<Role> roles; … }
  21. 21. Granularität – Simple Values @Entity public class User { @ElementCollection @CollectionTable(name = "…", joinColumns = …) private List<String> roles; … }
  22. 22. Herausforderungen Beziehungen Granularität Vererbung Image: scottchan / FreeDigitalPhotos.net
  23. 23. Vererbung – Single Table@Entity@Inheritance(strategy = SINGLE_TABLE)@DiscriminatorColumn(name = "…")public class User { …}@Entity@DiscriminatorValue("…")public class Admin extends User { …}
  24. 24. Vererbung – Table per Class @Entity @Inheritance(strategy = TABLE_PER_CLASS) public class User { … } @Entity public class Admin extends User { … }
  25. 25. Vererbung – Joined@Entity@Inheritance(strategy = JOINED)public class User { …}@Entitypublic class Admin extends User { …}
  26. 26. Vererbung – Secondary Table @Entity @Inheritance(strategy = JOINED) public class User { … } @Entity @SecondaryTable(name = "…") public class Admin extends User { … }
  27. 27. Vererbung – Mapped Superclass @MappedSuperclass public class AbstractUser { … }
  28. 28. Agenda JPA Core EE Integration Wolkige Zukunft?
  29. 29. Entity-Lebenszyklus EE IntegrationIntegration mit EJBIntegration mit CDI
  30. 30. Entity-Lebenszyklus New Removed entityManager.remove entityManager.persist entityManager.merge entityManager.detach entityManager.close Managed DetachedentityManager.find entityManager.mergequery.getResultList()query.getSingleResult()
  31. 31. Entity-Lebenszyklus New Removed Achtung: entityManager.remove Lazy-Initialization nicht im Zustand entityManager.persist entityManager.merge „detached“ entityManager.detach entityManager.close Managed DetachedentityManager.find entityManager.mergequery.getResultList()query.getSingleResult()
  32. 32. Wann wird der EntityManager eigentlich geschlossen?
  33. 33. Fragestellungen• EntityManager – Container- vs. Application-Managed – Transactional vs. Extended• Transaction – JTA vs. Resource Local – Synchronized vs. Unsynchronized• Datasource – JNDI vs. local – JTA vs. Non-JTA
  34. 34. Application-Managed• Erzeugung via entityManagerFactory.createEntityManager(…)• Transaktionsbehandlung (Manuell) – JTA entityManager.joinTransaction() – RESOURCE_LOCAL entityManager.getTransaction().begin() entityManager.getTransaction().commit()• Scope EXTENDED (Manuelle Verwaltung)
  35. 35. Application-Managed• Erzeugung via entityManagerFactory.createEntityManager(…)• Transaktionsbehandlung (Manuell) Nachteil: Keine PerstenceContext-Propagation! – JTA entityManager.joinTransaction() – RESOURCE_LOCAL entityManager.getTransaction().begin() entityManager.getTransaction().commit()• Scope EXTENDED (Manuelle Verwaltung)
  36. 36. Entity-Lebenszyklus EE IntegrationIntegration mit EJBIntegration mit CDI
  37. 37. EE IntegrationIntegration mit EJB
  38. 38. Transaction-Scoped@Statelesspublic class UserDaoEjb { @PersistenceContext private EntityManager em; … public void businessMethod() { // EntityManager available }}
  39. 39. Transaction-Scoped@Statelesspublic class UserDaoEjb { @PersistenceContext private EntityManager em; … @TransactionAttribute(NEVER) public void businessMethod() { //// EntityManager not available EntityManager available }}
  40. 40. Java-EE-5-Schichtenarchitektur Vorsicht mit Lazy-Transaktions- Initializationgrenze
  41. 41. Session-Scoped@Statefulpublic class UserDaoEjb { @PersistenceContext(type = EXTENDED) private EntityManager em; … public void businessMethod() { // EntityManager available }}
  42. 42. Session-Scoped@Statefulpublic class UserDaoEjb { @PersistenceContext(type = EXTENDED) private EntityManager em; … @TransactionAttribute(NEVER) public void businessMethod() { // EntityManager available }}
  43. 43. Unsynchronized (ab JPA 2.1) @Stateful public class UserDaoEjb { @PersistenceContext( synchronization = UNSYNCHRONIZED) private EntityManager em; … public void businessMethod() { // no flush after invocation } }
  44. 44. Unsynchronized (ab JPA 2.1) @Stateful public class UserDaoEjb { @PersistenceContext( synchronization = UNSYNCHRONIZED) private EntityManager em; … public void businessMethod() { em.joinTransaction(); flush‘n‘commit after invocation // no flush after invocation } }
  45. 45. Producer für CDI@Statelesspublic class UserServiceEjb { @Produces @PersistenceContext private EntityManager em; …}public class UserDao { @Inject private EntityManager em;}
  46. 46. Fazit EJB-Integration• Injection in Session Beans (stateful und stateless)• Transaktionsgrenze – Methodenaufruf der Session Bean (inklusive Transaction-Propagation)• Scopes – Transaction (alle Session Beans) – Session (Stateful Session Beans)
  47. 47. EE IntegrationIntegration mit EJB
  48. 48. EE IntegrationIntegration mit CDI
  49. 49. Integration mit CDI (ab JPA 2.1) public class MyEntityListener { @Inject @Current private User user; @PrePersist public void setCreator(MyEntity e) { e.setCreator(user); } }
  50. 50. Integration mit CDI (ab JPA 2.1) public class MyEntityListener { @Inject @CurrentAchtung: private User user; Verhalten bei Zugriff auf andere Entitäten @PrePersist von Beziehungen ist nicht oder Verändern public void standardisiert. setCreator(MyEntity e) { e.setCreator(user); } }
  51. 51. Integration mit CDIaußerhalb des Standards CDI bietet viele Scopes und ausgefeiltes Lifecycle-Management! Kann das nicht für den EntityManager genutzt werden?
  52. 52. Request-Scoped EntityManager @ApplicationScoped public class MyPersistenceUnit { @Produces @RequestScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } … }
  53. 53. Lifecycle-Management von CDI @ApplicationScoped public class MyPersistenceUnit { … public void closeEntityManager( @Disposes EntityManager entityManager) { entityManager.close(); } }
  54. 54. Schichtenarchitektur mit CDIEntityManager Lazy-Initializationlifecycle möglich
  55. 55. Schichtenarchitektur mit CDIEntityManager Lazy-Initializationlifecycle möglich Offen: Transaktionsgrenze
  56. 56. Transactional-Interceptor mit CDI @Transactional @Interceptor public class MyTransactionalInterceptor { @Inject private EntityManager em; … }
  57. 57. Transactional-Interceptor mit CDI @InterceptorBinding public @interface Transactional { }
  58. 58. Transactional-Interceptor mit CDI @Transactional @Interceptor public class MyTransactionalInterceptor { @Inject private EntityManager em; … }
  59. 59. Transactional-Interceptor mit CDI … @AroundInvoke public Object startTransaction( InvocationContext context) throws … { em.getTransaction().begin(); try { return context.proceed(); } finally { em.getTransaction().commit(); } }
  60. 60. Transactional-Interceptor mit CDI @ApplicationScoped public class MyUserDao { @Inject private EntityManager em; @Transactional public void persist(User user) { em.persist(user); } }
  61. 61. Weitere Scopes?@ApplicationScopedpublic class MyPersistenceUnit { @Produces @RequestScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } …}
  62. 62. Conversation-Scope?@ApplicationScopedpublic class MyPersistenceUnit { @Produces @ConversationScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } …}
  63. 63. Custom Scope@ApplicationScopedpublic class MyPersistenceUnit { @Produces @MyCustomScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } …}
  64. 64. Agenda JPA Core EE Integration Wolkige Zukunft?
  65. 65. Mandantenfähigkeit Wolkige Zukunft? JPA und NoSQL
  66. 66. Mandantenfähigkeit Wolkige Zukunft?
  67. 67. Mandantenfähigkeit in JPA 2.1• Ein Mandant pro Applikation• Drei Strategien des Datenzugriffs – SEPARATE_DATABASE – SEPARATE_SCHEMA – SHARED_TABLE (mit @TenantId Spalte)
  68. 68. Mandantenfähigkeit Wolkige Zukunft? JPA und NoSQL
  69. 69. Wolkige Zukunft?JPA und NoSQL
  70. 70. NoSQL – „Not only SQL“• Nicht relational• Distributed• Big Data• Eventually Consistent statt ACID• Map-Reduce statt SQL
  71. 71. Varianten• Key-Value – SimpleDB, Infinispan, Coherence, …• Wide-Column – BigTable, Cassandra, …• Document-Databases – MongoDB, CouchDB, …• Object-Databases• … (z.B. Graph-Databases)
  72. 72. Abfragemöglichkeiten• Nach Primärschlüssel• SQL-like Abfragesprache (z.B. SimpleDB)• Map-Reduce• …Joins sind teuer!
  73. 73. Wie passt das zu JPA?
  74. 74. Fokus von JPA auf RDBMS• Id-Generierungsstrategien• Joins• Subclassing• Polymorphie• Transaktionen
  75. 75. Vision• Trennung von – Mapping (@Entity, @Id) – Relationale Spezifika (@Table, @Column)?• Querying• Transaktions-Behandlung
  76. 76. Stand der DingeImplementierungen• SimpleJPA (SimpleDB)• Datanucleus-appengine (BigTable)• Hibernate-OGM (Infinispan, MongoDB, …)
  77. 77. FazitCloud Computing in Java EE• in Java EE 7 – Mandantenfähigkeit – JSR 347: Data Grids for the Java Platform• In Java EE 8 ???
  78. 78. FazitCloud Computing• in Java EEJPA in der Cloud gibt es! 7 – Mandantenfähigkeit den JPA-Standard ist Der Weg von NoSQL in aber noch weit! – JSR 347: Data Grids for the Java Platform• In Java EE 8 ???
  79. 79. Q&AVielen Dank für Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 Oldenburgarne.limburg@openknowledge.de ArneLimburg _openknowledge
  1. A particular slide catching your eye?

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

×