Java Data Objects(JDO)は、データオブジェクトをデータベースへ格納するための標準インターフェースです。 この標準規格は、Javaオブジェクトのアノテーションインタフェース、クエリによるオブジェクトの復元方法、トランザクションの使用方法などを定めています。 JDOを使用するアプリケーションは、データベースの実装(リレーショナルDB、階層型DB、オブジェクトDBなど)の違いを気にせずに済みます。 他の標準規格と同様に、JDOを使用すると、アプリケーションのストレージの変更が容易になります。
App Engine Java SDKは、App Engine Datastoreに対するJDO2.3の実装を提供しています。 この実装は、オープンソースのJDO2.3の実装であるDataNucleus Access Platformを基にしています。
JDOに関する詳細は、the Access Platform 1.1 documentationを参照してください。 (特に、JDO Mappingと JDO API)
App EngineでJDOを使用するためには、以下のことが必要になります。
もしあなたがGoogle Plugin for Eclipseを使用しているなら、これらの項目は手動で行う必要はありません。 プロジェクトウィザードが、JDOとDataNucleusのjarファイルを適切な位置に配置し、 jdoconfix.xmlファイルを自動生成します。 ビルドプロセスは拡張ステップを自動で行います。
もしあなたがプロジェクトのビルドにApache Antを使用しているなら、拡張ステップを実行するよう 設定されたタスクを利用できます。また、jarファイルのコピーと設定ファイルの作成をする必要があります。 Apache Antの使用を参照ください。
JDOとデータストアjarファイルは、App Engine Java SDKに含まれています。 appengine-java-sdk/lib/user/orm/ ディレクトリ内にあります。
jarファイルをアプリケーションのwar/WEB-INF/lib/内にコピーしてください。
appengine-api.jarがwar/WEB-INF/lib/内にあることを確認してください。 DataNucleusプラグインは、データストアにアクセスするためにこのjarファイルを使用します。
jdoconfig.xmlという名前のファイルがwar/WEB-INF/classes/META-INF/下にある必要があります。 このファイルを作成するか、ビルド時にソースディレクトリからコピーしてください。
以下のようにファイルを作成します。
<?xml version="1.0" encoding="utf-8"?>
<jdoconfig xmlns="http://java.sun.com/xml/ns/jdo/jdoconfig"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://java.sun.com/xml/ns/jdo/jdoconfig">
<persistence-manager-factory name="transactions-optional">
<property name="javax.jdo.PersistenceManagerFactoryClass"
value="org.datanucleus.store.appengine.jdo.DatastoreJDOPersistenceManagerFactory"/>
<property name="javax.jdo.option.ConnectionURL" value="appengine"/>
<property name="javax.jdo.option.NontransactionalRead" value="true"/>
<property name="javax.jdo.option.NontransactionalWrite" value="true"/>
<property name="javax.jdo.option.RetainValues" value="true"/>
<property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/>
</persistence-manager-factory>
</jdoconfig>
JDOは、データクラスをJDOの実装と関連付けるため、ビルドプロセスで拡張ステップを実行します。
Eclipseを使用している場合、Google plugin for Eclipseがこのステップを自動実行します。
Apache Antを使用している場合、SDKはこのステップを実行するためのAntタスクを含めます。 Antタスクの使用に関する詳しい情報は、Apache Antの使用を参照ください。
以下のコマンドにより、コマンドラインからコンパイル時に拡張ステップを実行させられます。
java -cp classpath com.google.appengine.tools.enhancer.Enhance class-files
classpathにはappengine-java-sdk/libにあるappengine-tools-api.jarを含む必要があります。
DataNucleus bytecode enhancerに関する詳しい情報は、 DataNucleusのドキュメントを参照ください。
アプリケーションは、PersistenceManagerクラスのインスタンスを使ってJDOに関与します。 PersistenceManagerFactoryクラスのメソッドを呼ぶことで、このクラスのインスタンスを取得できます。 PersistenceManagerFactoryは、JDOの設定を使ってPersistenceManagerのインスタンスを生成します。
PersistenceManagerFactoryインスタンスは、初期化に時間がかかるため、アプリケーションは 1つのインスタンスを再利用すべきです。 これを強要するためには、アプリケーションで、2つ以上のPersistenceManagerFactoryインスタンスを 取得した際に例外をスローします。 PersistenceManagerFactoryインスタンスを管理する簡単な方法は、以下のように、 スタティックなインスタンス(変数)を持つシングルトンラッパークラスを作ることです。
PMF.java
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;
public final class PMF {
private static final PersistenceManagerFactory pmfInstance =
JDOHelper.getPersistenceManagerFactory("transactions-optional");
private PMF() {}
public static PersistenceManagerFactory get() {
return pmfInstance;
}
}
アプリケーションは、factoryを使用して、 データストアにアクセスするためのリクエストごとに1つのPersistenceManagerを生成します。
import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManager;
import javax.jdo.PersistenceManagerFactory;
import PMF;
// ...
PersistenceManager pm = PMF.get().getPersistenceManager();
データオブジェクトを保存・更新・削除したり、クエリを実行する際にはPersistenceManagerを使用します。
処理を終了後、close()メソッドを呼び出す必要があります。close()後にPersistenceManagerインスタンスを 使用するとエラーになります。
try {
// ... do stuff with pm ...
} finally {
pm.close();
}
JDOの以下の特徴は、App Engineではサポートされていません。