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