Java Persistence - Standard meets Reality
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

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

Views

Total Views
1,629
On Slideshare
1,577
From Embeds
52
Number of Embeds
2

Actions

Shares
Downloads
25
Comments
0
Likes
2

Embeds 52

http://www.openknowledge.de 49
https://www.openknowledge.de 3

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 Standard meets RealityArne Limburg // open knowledge GmbH
  • 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. Agenda JPA Core EE Integration Wolkige Zukunft?
  • 4. Persistenz in Java EE Am Anfang war die JDBC-API… Image: digitalart / FreeDigitalPhotos.net
  • 5. Persistenz in Java EEErster Versuch:- Bean-Managed PersistenceZweiter Versuch:- Container-Managed PersistenceParallel: JDO Image: digitalart / FreeDigitalPhotos.net
  • 6. Persistenz in Java EE Schon besser: CMP 2Open Source auf der Überholspur: Castor, IBatis, Hibernate Ein Neubeginn: JPA Image: digitalart / FreeDigitalPhotos.net
  • 7. JPA aus 10.000 Metern
  • 8. EmbeddableEntityListener EntityManagerFactory Query EntityManagerEntityTransaction Entity Building Blocks Cache CriteriaQuery MappedSuperclass
  • 9. Eine JPA Entität@Entity @Table(name = "TAB_USER")public class User { @Id @Column(name = "USER_ID") private int id; …}
  • 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. Herausforderungen Beziehungen Granularität Vererbung Image: scottchan / FreeDigitalPhotos.net
  • 12. Beziehungen – many-to-one @Entity public class User { @ManyToOne @JoinColumn(name = "ROLE_ID") private Role role; … }
  • 13. Beziehungen - Bidirektional @Entity public class Role { @OneToMany(mappedBy = "role") private List<User> users; … }
  • 14. Beziehungen – one-to-one@Entitypublic class User { @OneToOne @JoinColumn(name = "ROLE_ID") private Role role; …}
  • 15. Beziehungen – geteilte Id@Entitypublic class Role { @Id @OneToOne private User user; …}
  • 16. Beziehungen – many-to-many @Entity public class User { @ManyToMany @JoinTable(name = "TAB_USER_ROLES", joinColumns = …, inverseJoinColumns = …) private List<Role> roles; … }
  • 17. Beziehungen – owning side @Entity public class Role { @ManyToMany(mappedBy = "roles") private List<User> users; … }
  • 18. Herausforderungen Beziehungen Granularität Vererbung Image: scottchan / FreeDigitalPhotos.net
  • 19. Granularität - Embeddables @Entity public class User { @Embedded @AttributeOverride(…) private Role role; … } @Embeddable public class Role { … }
  • 20. Granularität - ElementCollection @Entity public class User { @ElementCollection @CollectionTable(name = "…", joinColumns = …) private List<Role> roles; … }
  • 21. Granularität – Simple Values @Entity public class User { @ElementCollection @CollectionTable(name = "…", joinColumns = …) private List<String> roles; … }
  • 22. Herausforderungen Beziehungen Granularität Vererbung Image: scottchan / FreeDigitalPhotos.net
  • 23. Vererbung – Single Table@Entity@Inheritance(strategy = SINGLE_TABLE)@DiscriminatorColumn(name = "…")public class User { …}@Entity@DiscriminatorValue("…")public class Admin extends User { …}
  • 24. Vererbung – Table per Class @Entity @Inheritance(strategy = TABLE_PER_CLASS) public class User { … } @Entity public class Admin extends User { … }
  • 25. Vererbung – Joined@Entity@Inheritance(strategy = JOINED)public class User { …}@Entitypublic class Admin extends User { …}
  • 26. Vererbung – Secondary Table @Entity @Inheritance(strategy = JOINED) public class User { … } @Entity @SecondaryTable(name = "…") public class Admin extends User { … }
  • 27. Vererbung – Mapped Superclass @MappedSuperclass public class AbstractUser { … }
  • 28. Agenda JPA Core EE Integration Wolkige Zukunft?
  • 29. Entity-Lebenszyklus EE IntegrationIntegration mit EJBIntegration mit CDI
  • 30. Entity-Lebenszyklus New Removed entityManager.remove entityManager.persist entityManager.merge entityManager.detach entityManager.close Managed DetachedentityManager.find entityManager.mergequery.getResultList()query.getSingleResult()
  • 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. Wann wird der EntityManager eigentlich geschlossen?
  • 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. Application-Managed• Erzeugung via entityManagerFactory.createEntityManager(…)• Transaktionsbehandlung (Manuell) – JTA entityManager.joinTransaction() – RESOURCE_LOCAL entityManager.getTransaction().begin() entityManager.getTransaction().commit()• Scope EXTENDED (Manuelle Verwaltung)
  • 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. Entity-Lebenszyklus EE IntegrationIntegration mit EJBIntegration mit CDI
  • 37. EE IntegrationIntegration mit EJB
  • 38. Transaction-Scoped@Statelesspublic class UserDaoEjb { @PersistenceContext private EntityManager em; … public void businessMethod() { // EntityManager available }}
  • 39. Transaction-Scoped@Statelesspublic class UserDaoEjb { @PersistenceContext private EntityManager em; … @TransactionAttribute(NEVER) public void businessMethod() { //// EntityManager not available EntityManager available }}
  • 40. Java-EE-5-Schichtenarchitektur Vorsicht mit Lazy-Transaktions- Initializationgrenze
  • 41. Session-Scoped@Statefulpublic class UserDaoEjb { @PersistenceContext(type = EXTENDED) private EntityManager em; … public void businessMethod() { // EntityManager available }}
  • 42. Session-Scoped@Statefulpublic class UserDaoEjb { @PersistenceContext(type = EXTENDED) private EntityManager em; … @TransactionAttribute(NEVER) public void businessMethod() { // EntityManager available }}
  • 43. Unsynchronized (ab JPA 2.1) @Stateful public class UserDaoEjb { @PersistenceContext( synchronization = UNSYNCHRONIZED) private EntityManager em; … public void businessMethod() { // no flush after invocation } }
  • 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. Producer für CDI@Statelesspublic class UserServiceEjb { @Produces @PersistenceContext private EntityManager em; …}public class UserDao { @Inject private EntityManager em;}
  • 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. EE IntegrationIntegration mit EJB
  • 48. EE IntegrationIntegration mit CDI
  • 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. 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. Integration mit CDIaußerhalb des Standards CDI bietet viele Scopes und ausgefeiltes Lifecycle-Management! Kann das nicht für den EntityManager genutzt werden?
  • 52. Request-Scoped EntityManager @ApplicationScoped public class MyPersistenceUnit { @Produces @RequestScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } … }
  • 53. Lifecycle-Management von CDI @ApplicationScoped public class MyPersistenceUnit { … public void closeEntityManager( @Disposes EntityManager entityManager) { entityManager.close(); } }
  • 54. Schichtenarchitektur mit CDIEntityManager Lazy-Initializationlifecycle möglich
  • 55. Schichtenarchitektur mit CDIEntityManager Lazy-Initializationlifecycle möglich Offen: Transaktionsgrenze
  • 56. Transactional-Interceptor mit CDI @Transactional @Interceptor public class MyTransactionalInterceptor { @Inject private EntityManager em; … }
  • 57. Transactional-Interceptor mit CDI @InterceptorBinding public @interface Transactional { }
  • 58. Transactional-Interceptor mit CDI @Transactional @Interceptor public class MyTransactionalInterceptor { @Inject private EntityManager em; … }
  • 59. Transactional-Interceptor mit CDI … @AroundInvoke public Object startTransaction( InvocationContext context) throws … { em.getTransaction().begin(); try { return context.proceed(); } finally { em.getTransaction().commit(); } }
  • 60. Transactional-Interceptor mit CDI @ApplicationScoped public class MyUserDao { @Inject private EntityManager em; @Transactional public void persist(User user) { em.persist(user); } }
  • 61. Weitere Scopes?@ApplicationScopedpublic class MyPersistenceUnit { @Produces @RequestScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } …}
  • 62. Conversation-Scope?@ApplicationScopedpublic class MyPersistenceUnit { @Produces @ConversationScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } …}
  • 63. Custom Scope@ApplicationScopedpublic class MyPersistenceUnit { @Produces @MyCustomScoped public EntityManager createEntityManager( EntityManagerFactory factory) { return factory.createEntityManager(); } …}
  • 64. Agenda JPA Core EE Integration Wolkige Zukunft?
  • 65. Mandantenfähigkeit Wolkige Zukunft? JPA und NoSQL
  • 66. Mandantenfähigkeit Wolkige Zukunft?
  • 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. Mandantenfähigkeit Wolkige Zukunft? JPA und NoSQL
  • 69. Wolkige Zukunft?JPA und NoSQL
  • 70. NoSQL – „Not only SQL“• Nicht relational• Distributed• Big Data• Eventually Consistent statt ACID• Map-Reduce statt SQL
  • 71. Varianten• Key-Value – SimpleDB, Infinispan, Coherence, …• Wide-Column – BigTable, Cassandra, …• Document-Databases – MongoDB, CouchDB, …• Object-Databases• … (z.B. Graph-Databases)
  • 72. Abfragemöglichkeiten• Nach Primärschlüssel• SQL-like Abfragesprache (z.B. SimpleDB)• Map-Reduce• …Joins sind teuer!
  • 73. Wie passt das zu JPA?
  • 74. Fokus von JPA auf RDBMS• Id-Generierungsstrategien• Joins• Subclassing• Polymorphie• Transaktionen
  • 75. Vision• Trennung von – Mapping (@Entity, @Id) – Relationale Spezifika (@Table, @Column)?• Querying• Transaktions-Behandlung
  • 76. Stand der DingeImplementierungen• SimpleJPA (SimpleDB)• Datanucleus-appengine (BigTable)• Hibernate-OGM (Infinispan, MongoDB, …)
  • 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. 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. Q&AVielen Dank für Ihre Zeit.Kontakt:open knowledge GmbHBismarckstr. 1326122 Oldenburgarne.limburg@openknowledge.de ArneLimburg _openknowledge