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 1.3+ 1.5+
    Usage J2EE, J2SE J2EE, J2SE
    Persistence specification mechanism XML, Annotations, API XML, Annotations
    Datastore supported Any 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 Yes No
    Persist static/final fields No Not specified
    Transactions Pessimistic, Optimistic Optimistic, some locking
    Object Identity datastore-identity, application-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 !!
    Inheritance Each class has its own strategy Root class defines the strategy
    Operation cascade default persist, (delete)
    Operation Cascade configuration delete persist, delete, refresh
    Query Language JDOQL, SQL, others JPQL, SQL
    Query candidates Candidate without subclasses, Candidate and its subclasses Candidate and its subclasses
    Query of candidate collection yes no
    Query language case sensitivity JDOQL lowercase/UPPERCASE JPQL case-insensitive
    Query language aliases No, but has variables in JDOQL Yes in JPQL
    Query Criteria API No, available as extension in QueryDSL Yes
    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 256 255
    Default ORM identifiers (tables/columns) No Yes
    Default ORM mappings Yes, JDBC types defined for Java types No
    Caching interface L2 Caching API L2 Caching API

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