Java Data Objects (JDO) とは、Javaオブジェクトの永続性に関する仕様である。ドメインモデルの永続的サービスの透過性などもそれに含まれる。JDOの永続的オブジェクトは通常のJavaのクラスである。永続性を持たせるために特別なインタフェースを実装する必要もないし、特別なクラスから継承する必要もない。JDO 1.0はJava Community ProcessのJSR 12として2002年4月30日にリリースされた。JDO 2.0はJSR 243として開発され、2006年5月10日にリリースされた。
オブジェクトの永続性は、外部のXMLメタファイルで定義され、その中にはベンダー固有の拡張を含めることも可能である。JDOベンダーは開発者向けにエンハンサ (enhancers) を提供する。エンハンサはコンパイル済みのJavaクラスファイルを編集し、透過的な永続性が得られるようにする。JDOの仕様ではバイトコードの改良を必須としているわけではないが、JDOを実装する手段としてはこれが一般的である。現在、JDOベンダーが提供する永続性にはいくつかのオプションがある。例えば、関係データベースへの保存、オブジェクトデータベースへの保存、ファイルへの保存などである。
JDO強化クラスは異なるベンダーの実装であっても機能する。一度強化(エンハンス)した Java クラスは任意のベンダーのJDO製品で使うことができる。
JDOはJakarta EEにいくつかの方法で統合されている。まず、ベンダー実装はJakarta EE Connectorとして提供される。そして、JDOはJakarta EE transaction service(JTA Transaction Managerの実装)のコンテキストで動作する。
Enterprise JavaBeans 3.0 (EJB 3.0) では、永続性がカバーされている。それはEJB 2.0のEntity Beansの発展したものである。しかしEJB 3.0はJDOを採用せずに、Java Persistence API (JPA) 1.0を採用した。EJB 3.0はJDO 2.0のリリースの翌日の2006年5月11日に仕様が制定された。JDOとJPAは対立する仕様である。
JPAはjavax.persistenceパッケージを使い、EJB 3.0 (JSR 220) の中の独立した文書で定義されている。JPAはEJBコンテナを必要とせず、JDOのようにJava SE環境でも機能する。しかし、JPAはオブジェクト関係マッピング (ORM) の仕様であって、JDOのようにデータストアの種類に関係なく使える、透過的なオブジェクトの永続の仕様ではない。
JPAはJakarta EEの仕様の一部であるため、JDOよりも多く使われている。JDOの商用製品やオープンソースのプロジェクトの中には、既にJPA APIも実装し選択肢を増やしているものがある。