blob: a03eee99b5cdecb601c95204cdbf0e0bf8ce4aa4 [file] [log] [blame]
:_basedir:
:_imagesdir: images/
:notoc:
:notitle:
:grid: cols
:general:
[[index]]
== Which Persistence Specification ?anchor: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.
[cols=",,",options="header",]
|===
|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 |xref:jdo_v_jpa_orm.adoc[*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".