Which Persistence Specification ?

There are several competing persistence technologies available for Java. Two of these are "standardised" (via the JCP). When developing your application you need to choose the most appropriate technology for your needs. Java Data Objects (JDO) has been a standard since 2001 with the release of JDO1. It was improved with the release of JDO2. Just to confuse issues the Java Persistence API (JPA) was approved in its JPA1 form, and JDO2.1/JDO2.2 provide updates to JDO2 building on some of the new features of JPA1. Since then we have had JDO3 adding on extra metadata and enhancer standardisation, JPA2 providing criteria queries and JPA2.1 adding some further features. Below we show some of the differences of these 2 standards to give you assistance in selecting what you need. Highlighted in bold are the notable differences where one specification provides something not available in the other.

Feature JDO JPA

JDK Requirement






Persistence specification mechanism

XML, Annotations, API

XML, Annotations

Datastore supported


RDBMS only

Restrictions on persisted classes

no-arg constructor (could be added by compiler/enhancer)

No final classes. No final methods. Non-private no-arg constructor. Identity Field. Version Field.

Ability to persist "transient" fields



Persist static/final fields


Not specified


Pessimistic, Optimistic

Optimistic, some locking

Object Identity

datastore-identity, application-identity


Object Identity generation

Sequence, Table, Identity, Auto, UUID String, UUID Hex

Sequence, Table, Identity, Auto

Change objects identity

Throw exception when not allowed

Undefined !!

Supported types

Java primitive types, wrappers of primitive types, java.lang.String, java.lang.Number, java.math.BigInteger, java.math.BigDecimal, java.util.Currency, java.util.Locale, java.util.Date, java.sql.Time, java.sql.Date, java.sql.Timestamp, java.io.Serializable, boolean[], byte[], char[], double[], float[], int[], long[], short[], java.lang.Object, interface, Boolean[], Byte[], Character[], Double[], Float[], Integer[], Long[], Short[], BigDecimal[], BigInteger[], String[], PersistenceCapable[], interface[], Object[], Enums, java.util.Collection, java.util.Set, java.util.List, java.util.Map, Collection/List/Map of simple types, Collection/List/Map of reference (interface/Object) types, Collection/List/Map of persistable types

Java primitive types, wrappers of the primitive types, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, java.io.Serializable, byte[], Byte[], char[], Character[], Enums, java.util.Collection, java.util.Set, java.util.List, java.util.Map Collection/List/Map of persistable types

Embedded Fields

Embedded persistent objects, Embedded Collections, Embedded Maps

Embedded persistent objects

Access a non-detached field

Throw exception

Undefined !!


Each class has its own strategy

Root class defines the strategy

Operation cascade default

persist, (delete)

Operation Cascade configuration


persist, delete, refresh

Query Language

JDOQL, SQL, others


Query candidates

Candidate without subclasses, Candidate and its subclasses

Candidate and its subclasses

Query of candidate collection



Query language case sensitivity


JPQL case-insensitive

Query language aliases

No, but has variables in JDOQL

Yes in JPQL

Query Criteria API

No, available as extension in QueryDSL


Object retrieval control

Lazy/Eager control, fetch groups

Lazy/Eager control, entity graphs

Bulk update/delete

JDOQL Bulk Delete

JPQL Bulk Delete, JPQL Bulk Update

RDBMS Schema Control

Tables, columns, PK columns, PK constraints, FK columns, FK constraints, index columns, index constraints, unique key columns, unique key constraints

Tables, columns, PK columns, FK columns, unique key columns

ORM Relationships

Full range of Collection, Map, List, Array, 1-1, 1-N, M-N using PC, Non-PC and interface objects

Basic 1-1, 1-N, M-N, Collection<NonPC>, Map<NonPC>

Default ORM column size



Default ORM identifiers (tables/columns)



Default ORM mappings

Yes, JDBC types defined for Java types


Caching interface

L2 Caching API

L2 Caching API

As an overall conclusion "JPA" is a subset of what is available in "JDO".