JDOでBigtableへのデータ永続化を行うには?
ここからは、プログラム処理について見ていきます。最初は、サーブレットによるデータの書き込み(永続化)ですが、サーブレットからデータを書き込むためには、リスト4・5の2種類のクラスファイルを作成しておく必要があります。
package guestbook;
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) // 【1】
public class Greeting {
// 【1】始まり
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private User author;
@Persistent
private String content;
@Persistent
private Date date;
// 【1】終わり
// 【2】始まり
public Greeting(User author, String content, Date date) {
this.author = author;
this.content = content;
this.date = date;
}
// 【2】終わり
// 【3】始まり
public Long getId() {
return id;
}
public User getAuthor() {
return author;
}
public String getContent() {
return content;
}
public Date getDate() {
return date;
}
// 【3】終わり
// 【4】始まり
public void setAuthor(User author) {
this.author = author;
}
public void setContent(String content) {
this.content = content;
}
public void setDate(Date date) {
this.date = date;
}
// 【4】終わり
}
リスト4のクラスファイルは、POJO(Plain Old Java Object)形式で永続化対象オブジェクトごとに記述する必要があり、プログラムは【1】〜【4】の4つのブロックで構成されます。
【1】永続化されるデータの定義
【1】はデータストアに書き込まれるエンティティ(entity≒レコード)のプロパティ(property≒データ項目)を定義する部分です。RDB(Relational DataBase)のスキーマ定義に類似するような内容になっています。永続化されるデータは@Persistentアノテーションで指定され、その後にデータ項目を定義します。
例えば、【1】でユーザー記述テキストをフィールド名contentの文字列として永続化定義する場合は、以下のようになります。
@Persistent private String content;
Bigtableの場合も、RDBと同じようにキー項目が定義でき、【1】のように以下の定義をすれば、Long型整数のidがプライマリキーとして定義され、このキー値が自動生成されます。
@PrimaryKey @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) private Long id;
【2】コンストラクタでメンバ変数に値設定
インスタンス生成時のコンストラクタ呼び出しで、メンバ変数に値を設定(初期化)します。対象となる変数はすべて、アノテーション指定で永続化の対象となっています。つまり、コンストラクタ呼び出しの段階でデータストアへ書き込まれるプロパティ(データ項目)の値が設定されます。
【3】ゲッターメソッドの定義
ゲッターメソッドで永続化対象変数の値を返します。
【4】セッターメソッドの定義セッターメソッドの定義
セッターメソッドで永続化対象のメンバ変数に値を設定します。
PersistenceManagerクラスのインスタンスを生成するクラス
以上がGreeting.javaの記述内容ですが、もう1つ、PMF(PersistenceManageFactoryr)クラスを作成します。
package guestbook;
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;
}
}
データストアにアクセスするリクエストでは、PersistenceManagerクラスのインスタンスを生成する必要があります。しかし、このインスタンス生成の初期化では、ある程度の時間が必要です。ただし、この中で定義されているメソッドはstaticで定義されているため、インスタンス生成は1つだけになり、すべてのアプリケーションから共通に使い回せます。
このクラスはリスト4のGreeting.javaとは異なっていて、アクセスするデータストアのデータ項目などアプリケーションに依存しない定型的な内容なので、データストアにアクセスする場合は同じ内容で定型的に追加を行えばよいクラスファイルです。ただし、パッケージ(package)名だけは、使用するプロジェクトに合わせて修正します。
以上の準備ができたら、いよいよ次ページでは、Bigtableにアクセスするサーブレットの記述に入り、JSPに表示します。
Copyright © ITmedia, Inc. All Rights Reserved.