Java Data Objects (JDO)
Overview and Future
Michael Vorburger, Vertical*i
Java User Group Switzerland
Zurich, 31.03.05
Agenda








Object Persistence
O/R Mapping (ORM)
History
JDO Introduction
JDO API
JDOQL
JDO 2.0 (JSR 243)





Using JDO in EJB 2.1
Using JDO in Web Apps
Using JDO and/or JDBC
EJB 3.0 (JSR 220)
Future
JDO Implementations
(Vendors & OSS)
2005-03-31
2
About Speaker





Personal interest in persistence space
Culprit for an in-house ORM layer
Somehow picked up JDO in 2001
Core Java Data Objects co-author
For past ca. 3 years user of JDO
2005-03-31
3
About Audience

How many of you would consider
themselves “moderately familiar” with
JDO, or another similar persistence
framework, anyway?

How many of you have read the JDO
2.0 and EJB 3.0 Persistence Specs?
2005-03-31
4
Object Persistence Concepts

Graph of data objects (“Domain Model”)


API: persist(), Persistence by Reachability
Transactions
Query!

Internal: Memory Management, Caching, etc.

2005-03-31
5
O/R Mapping (ORM)
“Impedance Mismatch” of OOP & RBDMS:
 Classes vs. Tables, Inheritance mapping strategies
 Relationships: Single 1-1 or 1-M, Multiple M-N, “Link
with attributes” DBA mixed data and relationship,
Inverses/Bi-directionality, Lists, Maps
 Identity Management, Uniqueness
 Class Attribute vs. Column Type Mappings
More in Core JDO Book Chapter 2, but: Solutions for
mismatches exist; see also your ORM Vendor Doc!
2005-03-31
6
History


Few things fall from the sky…
object persistence in general
and JDO in particular build
upon a “long” history

Have you heard of any of
these names before?





2005-03-31
CORBA POS
Persistent Object
Service
Project Forest of Sun
Labs (OPJ, PJama)
ODMG API
Gemstone, O2, …
TopLink (15y+)
(EJB 2.1 Entity Beans)
7
JDO Introduction

JDO is an “interface-based API for selection and
transformation of transactional persistent storage
data into native Java programming language
objects” – Transparent Object Persistence!

Various implements for this API exist: Most as ORM
for your favourite RDB; some for standalone or
built-in OODBMS.

JDO 1.0 (JSR 12) in 2003
JDO 2.0 (JSR 243) Extension, accepted 1m ago

2005-03-31
8
JDO API: PMF & PM

PersistenceManagerFactory pmf =
JDOHelper.getPersistenceManagerFactory
(Properties p);

javax.jdo.PersistenceManager pm =
pmf.getPersistenceManager();

pm.makePersistent(customer);

customer = pm.getObjectById(oid,true);
2005-03-31
9
JDO Metadata & Enhancement



JDO XML metadata describes which classes can be
persisted (<class name=…>), with relevant options
(<collection element-type=…>, <extension …>)
JDO implementation run-time needs to interact with
persistence instances for lifecycle notification, load,
store/flush. Generally, this is achieved by running a
build-time tool, a JDO [byte code] enhancer. (It adds
the PersistenceCapable interface from SPI API to
persistent classes. This is no longer strictly for JDO
compliance,see BinaryCompatibility.)
Subject of hot debates – strange, think AOP etc.
2005-03-31
10
JDO API: Transactions

Non-Managed

javax.jdo.Transaction jtx =
pm.currentTransaction();

jtx.begin(); /* Do Stuff */ jtx.commit();

Managed (usually in J2EE container)

JTA API





javax.transaction.UserTransaction ut;
ut = {lookup somewhere, e.g. JNDI};
ut = ejbContext.getUserTransaction()
ut.begin(); /* Do Stuff */ ut.commit();
Declarative EJB container managed transactions
Core JDO Book Chapter 11
2005-03-31
11
JDO API: Query and JDOQL

Query q = pm.newQuery(Customer.class,
"customerName.startsWith('Tintin') &&
lastOrder.price > 100");

Collection results = (Collection)q.execute();
Iterator it = results.iterator();
while (it.hasNext()) {
Customer cust = (Customer)it.next());

Parameters: q.declareParameters(“String variable")
and q.execute(variable) etc. etc. – many many
more query facilities!
2005-03-31
12
JDO Queries: More of v1.0

JDOQL “Filter” can contain almost all Java
language operators, and some methods such as
Collection.isEmpty() & contains(),
String.startsWith() & endsWith()
[But not arbitrary other domain model methods!]

Ordering

Free Variables

Compiled Queries

Namespaces (packages)

Navigation (“dots”) in Filters, Ordering, etc.
2005-03-31
13
JDO Queries: More in v2.0






Single-String JDOQL Form
String.matches(), toLowerCase(), toUpperCase(),
indexOf() x2, substring() x2, Map.containsKey() &
containsValue(), Math.abs() & sqrt().
Paging Query Results with Query.setRange() or
“range :start to :end” and java.util.List results
User-Defined Result Class, single results, Unique
Projections, Aggregates functions
Standardized SQL pass-through
2005-03-31
14
JDO 2.0 News

Disconnected Object Graphs for multi-tier

Standardized RDBMS Mapping Descriptors
(“just” the agreed upon XML language; many
implementations already had possibilities)

Can get e.g. a java.sql.Connection
from javax.jdo.PersistenceManager

More: newNamedQuery, FetchPlan,
Sequence, delete by query, Multiple User
Objects on PM, etc.
2005-03-31
15
JDO Implementations [DISCLAIMER]

Open Source






JPOX
ObjectWeb Speedo
TJDO
XORM (?)
Apache JDO 2.0 RI (?)
Orient (ODBMS, OSS is new)

Commercial non-ORM



Non-JDO ORMs



Commercial JDO ORM Vendors





2005-03-31
Versant (incl. Poet)
ObjectDB (simple &
inexpensive)

JBoss Hibernate
Oracle Toplink
Castor JDO
OJB (?)
…

Solarmetric Kodo
Xcalia (formerly Libelis LiDO) .FR 
Signsoft intellBO .DE
Versant Open Access (formerly JDO Genie)
Others, e.g. Exadel, ObjectFrontier, ObjectMatter, Spadesoft XJDO, …
16
JDO & EJB 2.1

EJB 2.1 CMP Entity Beans mixed persistence
and remoting, with a complicated API and
development model (container) – sorry, but
consider that dead, essentially.

Session and Message-Driven Beans however
certainly have their place. So JDO inside the
implementation logic of those makes a lot of
sense!
2005-03-31
17
JDO & EJB 2.1

When using JDO inside a RPC-like (“SOA”)
EJB Session Bean (or RMI, Spring
Remoting.. your-favourite-here) :

“Syntax” aspects: About how to get…, when
to… etc. For full code details see Core JDO
book chapter 9 and/or Vendor Doc.

“Architectural” aspects: How to write your DTOs
(AKA VO) here – or do you write them at all?!
2005-03-31
18
JDO & EJB: DTO (AKA VO)

Either, “traditionally” write dedicated
Serializable DTO/VO in addition to PC,
maybe per service/use case. Nothing new;
see Core J2EE Patterns etc.

Or, mark domain model PCs as
Serializable (although JDO will never
serialize) and use makeTransient (1.0) or
detachCopy (2.0)
2005-03-31
19
JDO & EJB: detachCopy

New JDO 2.0 state: detached-clean/dirty. API:
Object PersistenceManager.detachCopy(Object pc);
Object PersistenceManager.attachCopy(Object detached,
boolean makeTransactional);



Scenario: detach/disconnect, close PM,
serialize across tier, modify disconnected, send
back. New PM, new Tx, re-attach.
Keeps original identity and version!
Simplifies & makes safer the similar manual
makeTransient() approach from Core JDO
book chapter 9.
2005-03-31
20
JDO in the Web Tier (directly)

If your project does not need EJB-like remoting and
physical separation of tiers, directly using JDO in
the Web Tier (Struts, JSF, etc.) can be very nice,
and lead to a simple and efficient development
model!

Recommended Architecture: One shared PMF
(application context) and one PM and Tx per
request (context), managed by a Servlet Filter.
Better: Enforce Web MVC with “Model 2” View,
allowing “pull view” (e.g. JSP) but read-only; allow
write changes in “Controller“ only.
2005-03-31
21
JDO and/or JDBC?

Using JDO (any ORM) does not necessarily mean
no JDBC – mixing is possible and may make sense.
(Tx safe) [VI LOB]

Core JDO Book chapter 12 has analysis – but
outdated already because JDO 2.0 addresses
some cases.

Still, of course, for data-centric, database
processing intensive, performance sensitive e.g.
batch kind applications, as well as for very complex
existing fixed RDB schemas, ORM and thus JDO
may not be the appropriate road to go.
2005-03-31
22
EJB 3.0

EJB 3.0 EG decided to abandon EJB 2.1
Entity Beans, and create new and separate
Persistence Doc and API:

This will be an ORM not a transparent
Persistence API. Some other differences.
However, will also be usable in J2SE,
outside J2EE container.
2005-03-31
23
EJB 3.0


Also a POJO-style approach. Many real
world domain models will probably be usable
with both APIs!
Both a similar API, conceptually close for
practical purposes, e.g. life cycle aligned.
EntityManager.persist(),
EntityManager.createQuery(),
javax.persistence.Query.getResultList()

Query Languages (JDOQL & EJBQL) differ,
but maybe JDO 2.1 and EJB 3.1 allow crossspec query language? (A la SQL in JDO 2.0)
2005-03-31
24
Future of Java Persistence




Today, the choice is JDO; why wait? A
proven JCP standard with many
implementations.
EJB 3 Final Release supposedly “summer
2005” (?). Requires JDK 5. Slow adoption?
Longer Term (2-3 years?) … who knows?
Note: All major JDO implementations very
likely also EJB 3 "persistence engines".
2005-03-31
25
Q&A

Thanks for listening!

To play with “running code” after this:
http://www.jpox.org – great tutorials!

Questions?

Drinks.
2005-03-31
26
Descargar

Java Data Objects (JDO) Overview and Future