Java Persistence - Standard meets Reality

80
Java Persistence Java Persistence Standard meets Reality Arne Limburg // open knowledge GmbH Standard meets Reality Arne Limburg // open knowledge GmbH

description

Der JPA-Standard hat sich mit der Version 2.0 in der Java-EE-Welt etabliert. Aber was wird die Zukunft bringen? Welche Neuerungen kommen in JPA 2.1? Wohin geht der Weg, wenn Java-Objekte in der Cloud und/oder in einem NoSQL-Store persistiert werden sollen? Die Session wagt einen Rückblick und Ausblick auf Persistenz in Java EE.Speaker: Arne Limburg17.4.2012 | 18 - 19 Uhr | JAX, Mainz

Transcript of Java Persistence - Standard meets Reality

Page 1: Java Persistence - Standard meets Reality

Java PersistenceJava Persistence

Standard meets Reality

Arne Limburg // open knowledge GmbH

Standard meets Reality

Arne Limburg // open knowledge GmbH

Page 2: Java Persistence - Standard meets Reality

JPA 2.0

The technical objective of this work is

to provide an object/relational mapping facilityfor the Java application developer

using a Java domain model

to manage a relational database.Zitat: JPA Spezifikation, v 2.0

Page 3: Java Persistence - Standard meets Reality

AgendaAgenda

JPA CoreJPA Core

EE IntegrationEE Integration

Wolkige Zukunft?Wolkige Zukunft?

Page 4: Java Persistence - Standard meets Reality

Persistenz in Java EE

Am Anfang war dieJDBC-API…

Image: digitalart / FreeDigitalPhotos.net

Page 5: Java Persistence - Standard meets Reality

Persistenz in Java EE

Erster Versuch:- Bean-Managed PersistenceZweiter Versuch:- Container-Managed PersistenceParallel: JDO

Image: digitalart / FreeDigitalPhotos.net

Page 6: Java Persistence - Standard meets Reality

Persistenz in Java EE

Schon besser: CMP 2Open Source auf der Überholspur:

Castor, IBatis, Hibernate

Ein Neubeginn: JPA

Image: digitalart / FreeDigitalPhotos.net

Page 7: Java Persistence - Standard meets Reality

JPA aus 10.000 Metern

Page 8: Java Persistence - Standard meets Reality

Building Blocks

EntityManagerFactoryEntityManagerFactoryEntityManagerFactoryEntityManagerFactory

EntityManager

QueryQueryQueryQuery

EntityTra

nsaction

CriteriaQueryCriteriaQueryCriteriaQueryCriteriaQueryCacheCacheCacheCache

Entity

EntityListener

MappedSuperclass

Embeddable

Page 9: Java Persistence - Standard meets Reality
Page 10: Java Persistence - Standard meets Reality

Eine JPA Entität@Entity @Table (name = "TAB_USER")public class User {

@Id @Column(name = "USER_ID" )private int id ;…

}

Page 11: Java Persistence - Standard meets Reality

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 ;…

}

Page 12: Java Persistence - Standard meets Reality

Image: scottchan / FreeDigitalPhotos.net

Beziehungen

Granularität

Vererbung

Herausforderungen

Page 13: Java Persistence - Standard meets Reality

Beziehungen – many-to-one@Entitypublic class User {

@ManyToOne@JoinColumn (name = "ROLE_ID" )private Role role ;…

}

Page 14: Java Persistence - Standard meets Reality

Beziehungen - Bidirektional@Entitypublic class Role {

@OneToMany(mappedBy = "role" )private List<User> users ;…

}

Page 15: Java Persistence - Standard meets Reality

Beziehungen – one-to-one@Entitypublic class User {

@OneToOne@JoinColumn (name = "ROLE_ID" )private Role role ;…

}

Page 16: Java Persistence - Standard meets Reality

Beziehungen – geteilte Id@Entitypublic class Role {

@Id@OneToOneprivate User user ;…

}

Page 17: Java Persistence - Standard meets Reality

Beziehungen – many-to-many@Entitypublic class User {

@ManyToMany@JoinTable (name = "TAB_USER_ROLES",

joinColumns = …,inverseJoinColumns = …)

private List<Role> roles ;…

}

Page 18: Java Persistence - Standard meets Reality

Beziehungen – owning side@Entitypublic class Role {

@ManyToMany(mappedBy = "roles" )private List<User> users ;…

}

Page 19: Java Persistence - Standard meets Reality

Image: scottchan / FreeDigitalPhotos.net

Beziehungen

Granularität

Vererbung

Herausforderungen

Page 20: Java Persistence - Standard meets Reality

Granularität - Embeddables@Entitypublic class User {

@Embedded @AttributeOverride (…)private Role role ;…

}

@Embeddablepublic class Role {

…}

Page 21: Java Persistence - Standard meets Reality

Granularität - ElementCollection@Entitypublic class User {

@ElementCollection@CollectionTable (name = "…",

joinColumns = …)private List<Role> roles ;…

}

Page 22: Java Persistence - Standard meets Reality

Granularität – Simple Values@Entitypublic class User {

@ElementCollection@CollectionTable (name = "…",

joinColumns = …)private List<String> roles ;…

}

Page 23: Java Persistence - Standard meets Reality

Image: scottchan / FreeDigitalPhotos.net

Beziehungen

Granularität

Vererbung

Herausforderungen

Page 24: Java Persistence - Standard meets Reality

Vererbung – Single Table@Entity@Inheritance (strategy = SINGLE_TABLE)@DiscriminatorColumn (name = "…")public class User {

…}@Entity@DiscriminatorValue ( "…")public class Admin extends User {

…}

Page 25: Java Persistence - Standard meets Reality

Vererbung – Table per Class@Entity@Inheritance (strategy = TABLE_PER_CLASS)public class User {

…}

@Entitypublic class Admin extends User {

…}

Page 26: Java Persistence - Standard meets Reality

Vererbung – Joined@Entity@Inheritance (strategy = JOINED)public class User {

…}

@Entitypublic class Admin extends User {

…}

Page 27: Java Persistence - Standard meets Reality

Vererbung – Secondary Table@Entity@Inheritance (strategy = JOINED)public class User {

…}

@Entity @SecondaryTable (name = "…")public class Admin extends User {

…}

Page 28: Java Persistence - Standard meets Reality

Vererbung – Mapped Superclass

@MappedSuperclasspublic class AbstractUser {

…}

Page 29: Java Persistence - Standard meets Reality

AgendaAgenda

JPA CoreJPA Core

EE IntegrationEE Integration

Wolkige Zukunft?Wolkige Zukunft?

Page 30: Java Persistence - Standard meets Reality

EE IntegrationEE Integration

Integration mit CDIIntegration mit CDI

Integration mit EJBIntegration mit EJB

Entity-LebenszyklusEntity-Lebenszyklus

Page 31: Java Persistence - Standard meets Reality

New

Managed Detached

Removed

entityManager.persistentityManager.merge

entityManager.remove

entityManager.detachentityManager.close

entityManager.mergeentityManager.findquery.getResultList()query.getSingleResult()

Entity-Lebenszyklus

Page 32: Java Persistence - Standard meets Reality

New

Managed

Removed

entityManager.persistentityManager.merge

entityManager.remove

entityManager.detachentityManager.close

entityManager.mergeentityManager.findquery.getResultList()query.getSingleResult()

Entity-Lebenszyklus

Detached

Achtung:

Lazy-Initialization nicht im Zustand „detached“

Page 33: Java Persistence - Standard meets Reality

Wann wird der EntityManagereigentlich geschlossen?

Page 34: Java Persistence - Standard meets Reality

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

Page 35: Java Persistence - Standard meets Reality

Application-Managed

• Erzeugung via entityManagerFactory.createEntityManager(…)

• Transaktionsbehandlung (Manuell) – JTA entityManager.joinTransaction()

– RESOURCE_LOCAL entityManager.getTransaction().begin() entityManager.getTransaction().commit()

• Scope EXTENDED (Manuelle Verwaltung)

Page 36: Java Persistence - Standard meets Reality

Application-Managed

• Erzeugung via entityManagerFactory.createEntityManager(…)

• Transaktionsbehandlung (Manuell) – JTA entityManager.joinTransaction()

– RESOURCE_LOCAL entityManager.getTransaction().begin() entityManager.getTransaction().commit()

• Scope EXTENDED (Manuelle Verwaltung)

Nachteil:

Keine PerstenceContext-Propagation!

Page 37: Java Persistence - Standard meets Reality

EE IntegrationEE Integration

Integration mit CDIIntegration mit CDI

Integration mit EJBIntegration mit EJB

Entity-LebenszyklusEntity-Lebenszyklus

Page 38: Java Persistence - Standard meets Reality

EE IntegrationEE Integration

Integration mit EJBIntegration mit EJB

Page 39: Java Persistence - Standard meets Reality

@Statelesspublic class UserDaoEjb {

@PersistenceContextprivate EntityManager em;…

}

@Statelesspublic class UserDaoEjb {

@PersistenceContextprivate EntityManager em;…

public void businessMethod() {// EntityManager available

}}

Transaction-Scoped

Page 40: Java Persistence - Standard meets Reality

@Statelesspublic class UserDaoEjb {

@PersistenceContextprivate EntityManager em;…

}

@Statelesspublic class UserDaoEjb {

@PersistenceContextprivate EntityManager em;…

public void businessMethod() {// EntityManager available

}}

@Statelesspublic class UserDaoEjb {

@PersistenceContextprivate EntityManager em;…@TransactionAttribute ( NEVER)public void businessMethod() {

// EntityManager not available}

}

Transaction-Scoped

Page 41: Java Persistence - Standard meets Reality

Java-EE-5-Schichtenarchitektur

Transaktions-grenze

Vorsicht mit Lazy-Initialization

Page 42: Java Persistence - Standard meets Reality

@Statefulpublic class UserDaoEjb {

@PersistenceContext (type = EXTENDED)private EntityManager em;…

}

@Statefulpublic class UserDaoEjb {

@PersistenceContext (type = EXTENDED)private EntityManager em;…

public void businessMethod() {// EntityManager available

}}

Session-Scoped

Page 43: Java Persistence - Standard meets Reality

@Statefulpublic class UserDaoEjb {

@PersistenceContext (type = EXTENDED)private EntityManager em;…

}

@Statefulpublic class UserDaoEjb {

@PersistenceContext (type = EXTENDED)private EntityManager em;…

public void businessMethod() {// EntityManager available

}}

@Statefulpublic class UserDaoEjb {

@PersistenceContext (type = EXTENDED)private EntityManager em;…@TransactionAttribute ( NEVER)public void businessMethod() {

// EntityManager available}

}

Session-Scoped

Page 44: Java Persistence - Standard meets Reality

@Statefulpublic class UserDaoEjb {

@PersistenceContext (synchronization = UNSYNCHRONIZED)

private EntityManager em;…

}

@Statefulpublic class UserDaoEjb {

@PersistenceContext (synchronization = UNSYNCHRONIZED)

private EntityManager em;…public void businessMethod() {

// no flush after invocation}

}

Unsynchronized (ab JPA 2.1)

Page 45: Java Persistence - Standard meets Reality

@Statefulpublic class UserDaoEjb {

@PersistenceContext (synchronization = UNSYNCHRONIZED)

private EntityManager em;…

}

@Statefulpublic class UserDaoEjb {

@PersistenceContext (synchronization = UNSYNCHRONIZED)

private EntityManager em;…public void businessMethod() {

// no flush after invocation}

}

@Statefulpublic class UserDaoEjb {

@PersistenceContext (synchronization = UNSYNCHRONIZED)

private EntityManager em;…public void businessMethod() {

em.joinTransaction();// flush‘n‘commit after invocation

}}

Unsynchronized (ab JPA 2.1)

Page 46: Java Persistence - Standard meets Reality

Producer für CDI@Statelesspublic class UserServiceEjb {

@Produces @PersistenceContextprivate EntityManager em;…

}

public class UserDao {@Injectprivate EntityManager em;

}

Page 47: Java Persistence - Standard meets Reality

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)

Page 48: Java Persistence - Standard meets Reality

EE IntegrationEE Integration

Integration mit EJBIntegration mit EJB

Page 49: Java Persistence - Standard meets Reality

EE IntegrationEE Integration

Integration mit CDIIntegration mit CDI

Page 50: Java Persistence - Standard meets Reality

Integration mit CDI (ab JPA 2.1)

public class MyEntityListener {

@Inject @Currentprivate User user ;

@PrePersistpublic void setCreator(MyEntity e) {

e.setCreator( user );}

}

Page 51: Java Persistence - Standard meets Reality

Integration mit CDI (ab JPA 2.1)

public class MyEntityListener {

@Inject @Currentprivate User user ;

@PrePersistpublic void setCreator(MyEntity e) {

e.setCreator( user );}

}

Achtung:

Verhalten bei Zugriff auf andere Entitäten oder Verändern von Beziehungen ist nicht

standardisiert.

Page 52: Java Persistence - Standard meets Reality

Integration mit CDIaußerhalb des Standards

CDI bietet viele Scopes und ausgefeiltes

Lifecycle-Management!

Kann das nicht für den EntityManager genutzt werden?

Page 53: Java Persistence - Standard meets Reality

Request-Scoped EntityManager@ApplicationScopedpublic class MyPersistenceUnit {

@Produces@RequestScopedpublic EntityManager createEntityManager(

EntityManagerFactory factory) {return factory.createEntityManager();

}…

}

Page 54: Java Persistence - Standard meets Reality

Lifecycle-Management von CDI@ApplicationScopedpublic class MyPersistenceUnit {

public void closeEntityManager(@Disposes EntityManager entityManager) {

entityManager.close();}

}

Page 55: Java Persistence - Standard meets Reality

Schichtenarchitektur mit CDIEntityManagerlifecycle

Lazy-Initializationmöglich

Page 56: Java Persistence - Standard meets Reality

Schichtenarchitektur mit CDIEntityManagerlifecycle

Lazy-Initializationmöglich

Offen:

Transaktionsgrenze

Page 57: Java Persistence - Standard meets Reality

Transactional-Interceptor mit CDI@Transactional @Interceptorpublic class MyTransactionalInterceptor {

@Injectprivate EntityManager em;

…}

Page 58: Java Persistence - Standard meets Reality

Transactional-Interceptor mit CDI@InterceptorBindingpublic @interface Transactional {}

Page 59: Java Persistence - Standard meets Reality

Transactional-Interceptor mit CDI@Transactional @Interceptorpublic class MyTransactionalInterceptor {

@Injectprivate EntityManager em;

…}

Page 60: Java Persistence - Standard meets Reality

Transactional-Interceptor mit CDI…@AroundInvokepublic Object startTransaction(

InvocationContext context) throws … {em.getTransaction().begin();try {

return context.proceed();} finally {

em.getTransaction().commit();}

}

Page 61: Java Persistence - Standard meets Reality

Transactional-Interceptor mit CDI@ApplicationScopedpublic class MyUserDao {

@Injectprivate EntityManager em;

@Transactionalpublic void persist(User user) {

em.persist(user);}

}

Page 62: Java Persistence - Standard meets Reality

Weitere Scopes?@ApplicationScopedpublic class MyPersistenceUnit {

@Produces@RequestScopedpublic EntityManager createEntityManager(

EntityManagerFactory factory) {return factory.createEntityManager();

}…

}

Page 63: Java Persistence - Standard meets Reality

Conversation-Scope?@ApplicationScopedpublic class MyPersistenceUnit {

@Produces@ConversationScopedpublic EntityManager createEntityManager(

EntityManagerFactory factory) {return factory.createEntityManager();

}…

}

Page 64: Java Persistence - Standard meets Reality

Custom Scope@ApplicationScopedpublic class MyPersistenceUnit {

@Produces@MyCustomScopedpublic EntityManager createEntityManager(

EntityManagerFactory factory) {return factory.createEntityManager();

}…

}

Page 65: Java Persistence - Standard meets Reality

AgendaAgenda

JPA CoreJPA Core

EE IntegrationEE Integration

Wolkige Zukunft?Wolkige Zukunft?

Page 66: Java Persistence - Standard meets Reality

Wolkige Zukunft?Wolkige Zukunft?

JPA und NoSQLJPA und NoSQL

MandantenfähigkeitMandantenfähigkeit

Page 67: Java Persistence - Standard meets Reality

Wolkige Zukunft?Wolkige Zukunft?

MandantenfähigkeitMandantenfähigkeit

Page 68: Java Persistence - Standard meets Reality

Mandantenfähigkeit in JPA 2.1

• Ein Mandant pro Applikation• Drei Strategien des Datenzugriffs

– SEPARATE_DATABASE– SEPARATE_SCHEMA– SHARED_TABLE (mit @TenantId Spalte)

Page 69: Java Persistence - Standard meets Reality

Wolkige Zukunft?Wolkige Zukunft?

JPA und NoSQLJPA und NoSQL

MandantenfähigkeitMandantenfähigkeit

Page 70: Java Persistence - Standard meets Reality

Wolkige Zukunft?Wolkige Zukunft?

JPA und NoSQLJPA und NoSQL

Page 71: Java Persistence - Standard meets Reality

NoSQL – „Not only SQL“

• Nicht relational • Distributed• Big Data• Eventually Consistent

statt ACID• Map-Reduce statt SQL

Page 72: Java Persistence - Standard meets Reality

• Key-Value– SimpleDB, Infinispan, Coherence, …

• Wide-Column– BigTable, Cassandra, …

• Document-Databases– MongoDB, CouchDB, …

• Object-Databases• … (z.B. Graph-Databases)

Varianten

Page 73: Java Persistence - Standard meets Reality

Abfragemöglichkeiten

• Nach Primärschlüssel• SQL-like Abfragesprache (z.B.

SimpleDB)• Map-Reduce• …

Joins sind teuer!

Page 74: Java Persistence - Standard meets Reality

Wie passt das zu JPA?

Page 75: Java Persistence - Standard meets Reality

Fokus von JPA auf RDBMS

• Id-Generierungsstrategien• Joins• Subclassing• Polymorphie• Transaktionen

Page 76: Java Persistence - Standard meets Reality

Vision

• Trennung von– Mapping (@Entity, @Id)– Relationale Spezifika

(@Table, @Column)?

• Querying• Transaktions-Behandlung

Page 77: Java Persistence - Standard meets Reality

Stand der Dinge

Implementierungen • SimpleJPA (SimpleDB)• Datanucleus-appengine

(BigTable)• Hibernate-OGM

(Infinispan, MongoDB, …)

Page 78: Java Persistence - Standard meets Reality

Fazit

Cloud Computing in Java EE• in Java EE 7

– Mandantenfähigkeit– JSR 347: Data Grids for the Java Platform

• In Java EE 8???

Page 79: Java Persistence - Standard meets Reality

Fazit

Cloud Computing• in Java EE 7

– Mandantenfähigkeit– JSR 347: Data Grids for the Java Platform

• In Java EE 8???

JPA in der Cloud gibt es!

Der Weg von NoSQL in den JPA-Standard ist aber noch weit!

Page 80: Java Persistence - Standard meets Reality

Vielen Dank für Ihre Zeit.

Kontakt:

open knowledge GmbHBismarckstr. 1326122 Oldenburg

[email protected]

ArneLimburg_openknowledge

Q&A