JDO を利用したGAEデータストアの使用
GAEでは、JDOまたはJPAによるインタフェースでデータアクセスに対応します。ここでは、JDOについて書きます。
GAEデータストアの特徴
<現在調査中>
- BigTableと呼ばれる列指向DBMSである
- RDBのようにテーブル構造をもつが、RDBのようなリレーションを利用した検索などはできない。
JDOとは
- データの永続性を扱うインタフェース
- データベースを扱う際のデータの状態(CRUD)管理をする
JDOインタフェースを利用することから、感覚的には、HibernateのようなORマッピングツールを使うのと同じように扱えます。
ファイル構成
今のところ、NetbeansのGAEプラグインでは、各構成ファイルを自動生成する機能がありません。よって下記のファイルは手動で作成してもらうことになります。
JDO設定ファイル
ソースの直下にMETA-INFフォルダを作成し、jdoconfig.xmlというファイルを作成します. ダウンロード
<?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>
PersistenceManager クラス
データベースへアクセスするための接続を管理するクラスです。ダウンロード
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;
}
}
データbeanクラス
データを格納するためのbeanクラスです。POJOであることが特徴です。
import java.util.Date;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.IdentityType;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.users.User;
@PersistenceCapable(identityType =
IdentityType.APPLICATION)
public
class
Student
{
@PrimaryKey
@Persistent
private
Long id;
@Persistent
private
String name;
@Persistent
private
Date date;
public
Student(String name,
Date date)
{
this.name = name;
this.date = date;
}
public
Long getId()
{
return id;
}
public
String getName()
{
return name;
}
public
Date getDate()
{
return date;
}
public
void setId(Long id)
{
this.id = id;
}
public
void setName(String name)
{
this.name = name;
}
public
void setDate(Date date)
{
this.date = date;
}
}
サンプルプログラム
JDOのマネージャーのインスタンス呼び出し
//
JDOのマネージャーのインスタンス呼び出し
PersistenceManager pm = PMF.get().getPersistenceManager();
登録の場合
//登録したいデータストア
Student st = new Student(name, date);
pm.makePersistent(st); //closeすることで更新されます
pm.close();
検索(idをキーにする)
//参照したいデータの
キーを指定
Student st = pm.getOBjectById(student.class,id);
データの検索については、JDOQLを利用してRDBのように条件検索をすることができます。JDOQLによる検索。
更新(idをキーにする)
//更新したいデータの
キーを指定
Student st = pm.getOBjectById(student.class,id);
st.setName("ochi2");
//closeすることで更新されます
pm.close();
削除(idをキーにする)
//削除したいデータの
キーを指定
Student st = pm.getOBjectById(student.class,id);
pm.deletePersistance(st);
ローカル用データストアの管理
Netbeans上で動かした際は、データベースはローカルにあります。ローカル用の管理コンソールがあり、
http://localhost:8080/_ah/admin (http://localhost:8888/_ah/adminでアクセスできる時もある?)
でアクセスできます。データベースの中身も見れます。
データベースの内容は再起動しても消えません。ゼロからやり直したい場合は、データファイルを削除することになります。その場所は
<プロジェクトのディレクトリ>/build/web/WEB-INF/appengine-generated/local_db.bin