Presentation made at JavaONE, Hyderabad, on 10th May 2011. Slides are a slightly modified version of what's presented by Linda D. at JavaONE, SF, in 2010.
Continuing Bonds Through AI: A Hermeneutic Reflection on Thanabots
Java Persistence API 2.0: An Overview
1. <Insert Picture Here>
JavaTM Persistence API 2.0: An Overview
Sanjeeb Sahoo
Sr. Staff Engineer, Sun, an Oracle Company
2. The following/preceding is intended to outline
our general product direction. It is intended for
information purposes only, and may not be
incorporated into any contract. It is not a
commitment to deliver any material, code, or
functionality, and should not be relied upon in
making purchasing decisions.
The development, release, and timing of any
features or functionality described for Oracle’s
products remains at the sole discretion of
Oracle.
2
3. JavaTM Persistence API: Brief History
• Java Persistence 1.0
– Standardized object/relational mapping for Java
applications
– Available as part Java EE 5 Platform or standalone
– Covered most of the essential features
• Java Persistence 2.0
– More and better increased application portability
– Released in December 2009
– Available as part of Java EE 6 Platform or standalone
– Reference Implementation is EclipseLink
– Available as part of GlassFish v3
3
4. Key Interfaces
• EntityManagerFactory
– Used to create entity managers
– One entity manager factory per persistence unit
• EntityManager
• Used to manage persistence context
• Entities read/written from database
• Operations: persist, remove, find, refresh, createQuery,…
• Query, TypedQuery
• Used for query configuration, parameter binding, query
execution
4
5. Packaging
• Java SE (Standalone Java Application)
– Jar file with entities, application classes and META-
INF/persistence.xml
• Java EE
– War file
• WEB-INF/classes/META-INF/persistence.xml
• WEB-INF/lib/entities.jar (with META-INF/persistence.xml)
– EJB jar
• EJBs and entities and META-INF/persistence.xml
– EAR file
• lib/entities.jar with META-INF/persistence.xml
5
7. JavaTM Persistence 2.0:
New Features
• Expanded modeling capabilities
• Additional O/R mapping options
• Additions to Java Persistence query language
• Metamodel API
• Criteria API
• Pessimistic locking
• Standardization of many configuration options
• Support for validation
7
8. Object/Relational Mapping
Essentials
• Entities
• Basic types
• Strings, integers, floats, decimals, …
• Embeddable classes
• E.g., Address
• Relationships
• One-to-one, one-to-many/many-to-one, many-to-many
• Collections modeled with java.util Collection, Set, List, or Map
• Customized via metadata: @JoinColumn, @JoinTable, etc.
• Inheritance
• Single table, joined subclass, table per class (optional)
8
9. JavaTM Persistence 2.0:
Expanded modeling and mapping
• Collections of basic types
• Collections of embeddables
• Richer support for embeddable classes
– Multiple levels of embedding
– Embeddable classes with relationships
• Persistently ordered lists
• Improved map support
– Joins with additional columns
– Ternary relationships
• Orphan deletion
9
16. Multiple Levels of Embedding
@Entity public class Employee {
@Id int empId;
String name;
ContactInfo contactInfo;
. . .
}
@Embeddable public class ContactInfo {
@Embedded Address address;
. . .
}
16
17. Embeddables with Relationships
@Entity public class Employee {
@Id int empId;
String name;
ContactInfo contactInfo;
. . .
}
@Embeddable public class ContactInfo {
@Embedded Address address;
@OneToMany Set<Phone> phones;
. . .
}
17
18. Persistently Ordered Lists
• Order is maintained in database by provider
– Uses additional (integral) ordering column
• Specified with @OrderColumn
• Provides alternative to @OrderBy
18
19. Persistently Ordered Lists
@Entity public class CreditCard {
@Id String cardNumber;
@ManyToOne Customer customer;
...
@OneToMany(mappedBy=“creditCard”)
@OrderColumn(name=“TXORDER”)
List<CardTransaction> transactionHistory;
...
}
@Entity public class CardTransaction {
@Id @GeneratedValue Long id;
@ManyToOne @JoinColumn(name=“CARDID”)
CreditCard creditCard;
@Temporal(DATE) Date txDate;
...
}
19
21. @OrderBy Alternative
@Entity public class CreditCard {
@Id String cardNumber;
@ManyToOne Customer customer;
...
@OneToMany(mappedBy=“creditCard”)
@OrderColumn(name=“TXORDER”) @OrderBy(“txDate”)
List<CardTransaction> transactionHistory;
...
}
@Entity public class CardTransaction {
@Id @GeneratedValue Long id;
@ManyToOne @JoinColumn(name=“CARDID”)
CreditCard creditCard;
@Temporal(DATE) Date txDate;
...
}
21
22. Generalized Maps
• Map key can be
– Basic type
– Embeddable
– Entity
• Map value can be
– Basic type
– Embeddable
– Entity
• Support for legacy join tables with additional
columns
• Support for ternary relationships
22
23. Generalized Maps
• Map collection is specified with
– @ElementCollection, @OneToMany, @ManyToMany
– Annotation is determined by map value
• Customize mapping with:
– @CollectionTable (for element collection)
– @JoinTable (for relationship)
– @MapKeyColumn (for basic map key)
– @MapKeyJoinColumn(s) (for entity key)
– @AttributeOverride(s) using “key.” or “value.” syntax
(for embeddables)
23
24. Generalized Maps
@Entity
public class VideoStore {
@Id Integer storeId;
Address location;
@ElementCollection
@CollectionTable(
joinColumn=@JoinColumn(name=“VIDEO_STOREID”))
Map<Movie, Integer> inventory;
...
}
@Entity
public class Movie {
@Id String title;
String director;
...
}
24
25. Generalized Maps
VIDEOSTORE
STOREID NAME STREET CITY STATE …
MOVIE
TITLE DIRECTOR …
VIDEOSTORE_INVENTORY
VIDEO_STOREID INVENTORY_KEY INVENTORY
25
26. Automatic Orphan Deletion
• Deletion of related entities when removed from
relationship
– For entities logically “owned” by “parent”
– For one-to-one and one-to-many relationships
• Specified with orphanRemoval element
– cascade=REMOVE is redundant
26
28. Java Persistence Query Language:
New Functionality
• Support for all new modeling and mapping
features
• Operators and functions in select list
• Case, coalesce, nullif expressions
• Restricted polymorphism
• Collection-valued input parameters
• Date / time / timestamp literals
28
29. New Operators
• INDEX
– For ordered lists
• KEY, VALUE, ENTRY
– For maps
• CASE, COALESCE, NULLIF
– For case expressions and the like
• TYPE
– For entity type expressions / restricted polymorphism
29
31. Criteria API
• Object-based API for building queries
• Designed to mirror JPQL semantics
• Strongly typed
– Based on type-safe metamodel of persistence unit
– Heavy use of Java generics
– Typing carries through to query execution as well
• Supports object-based or strong-based navigation
31
32. Criteria API: Core Interfaces
• CriteriaQuery
– Represents a query definition object
– Used to add / replace / browse constituent query elements
– select, from, where, orderBy, groupBy, having,… methods
• CriteriaBuilder
– Factory for CriteriaQuery objects
– Obtained from EntityManager or EntityManagerFactory
– Used to create selections, expressions, restrictions,
orderings…
• Root
– Query root
32
33. Criteria API: Core Interfaces
• Join, ListJoin, MapJoin,…
– Joins from a root or existing join
• Path
– Navigation from a root, join, path
• Subquery
• Parameter
• TypedQuery
– Executable query object
– Extends Query interface
• Tuple
– Multiple-valued result type
33
34. The World’s Simplest Query
SELECT c
FROM Customer c
CriteriaBuilder cb = ...;
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> c = cq.from(Customer.class);
cq.select(c);
34
35. Joins and Navigation
SELECT c
FROM Customer c join c.orders o
CriteriaBuilder cb = ...;
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> c = cq.from(Customer.class);
Join<Customer, Order> o = customer.join(“orders”);
cq.select(c);
35
36. Joins and Navigation: What’s the Problem?
SELECT c
FROM Customer c join c.orders o
CriteriaBuilder cb = ...;
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> c = cq.from(Customer.class);
Join<Customer, Order> o = customer.join(“wombats”);
cq.select(c);
36
37. Metamodel
• Abstract, “schema-level” view of managed
classes of persistence unit
– Entities, mapped superclasses, embeddables, and their
attributes and relationships
• Accessible at runtime
– EntityManagerFactory.getMetamodel()
– EntityManager.getMetamodel()
• Useful for frameworks
• Provides foundation for type-safe queries
• Can be materialized as static metamodel classes
– Use javac + annotation processor
37
38. Type-safe Navigation
SELECT c
FROM Customer c join c.orders o
CriteriaBuilder cb = ...;
CriteriaQuery<Customer> cq = cb.createQuery(Customer.class);
Root<Customer> c = cq.from(Customer.class);
Join<Customer, Order> o = customer.join(Customer_.orders);
cq.select(c);
38
39. Optimistic Locking
• Assumes read-committed isolation, deferred
writes
– Short term read-locks
– Long term write-locks
• Layered on top of @Version use
– Verify version for updated entities before transaction
commit
• Lock Modes
– OPTIMISTIC (READ)
– OPTIMISTIC_FORCE_INCREMENT (WRITE)
• “READ” lock => verify version for clean data
• “WRITE” lock => update version for clean data
39
40. Pessimistic Locking
• Grab database locks upfront
• Lock Modes
– PESSIMISTIC_READ
– PESSIMISTIC_WRITE
– PESSIMISTIC_FORCE_INCREMENT
• Normal (default) pessimistic locking
– Persistent state of entity (except element collections)
– Relationships where entity holds foreign key
• Extended pessimistic locking
– Uses javax.persistence.lock.scope property (EXTENDED)
– Element collections and relationships in join tables
– Phantoms are possible
40
47. JPA 2.1 Candidate Features
http://jcp.org/en/jsr/detail?id=338
NEW
Multi-tenancy
Support for stored procedures, vendor function
Update and Delete Criteria queries, JPQL ↔
Criteria
Query by Example
Support for schema generation
UUID generator type
Persistence Context synchronization control
Dynamic definition of PU
Additional event listeners
47
48. Summary
• Expanded modeling capabilities
• Additional O/R mapping options
• Additions to Java Persistence query language
• Metamodel API
• Criteria API
• Pessimistic locking
• Standardization of many configuration options
• Support for validation
• Improved portability
48
49. Resources
• Java Persistence 2.0 Specification
http://jcp.org/en/jsr/detail?id=317
• Reference Implementation is EclipseLink
http://www.eclipse.org/eclipselink
• Available as part of Java EE 6 with GlassFish
http://glassfish.org
• Book: Pro JPA 2 (Keith & Schincariol)
49
50. The following/preceding is intended to outline
our general product direction. It is intended for
information purposes only, and may not be
incorporated into any contract. It is not a
commitment to deliver any material, code, or
functionality, and should not be relied upon in
making purchasing decisions.
The development, release, and timing of any
features or functionality described for Oracle’s
products remains at the sole discretion of
Oracle.
50