2010/04/09

GAE/J入門 第一回 ~データストアへの書き込み~ [ GAE ]

さてさて、やると言ってからだいぶ時間が
経ってしまいましたが

こちらのGAE/J入門に手を
出してみるとします。
こちらの入門の第一回は環境の構築なんですが書いてある通りに進めれば
特に問題なくできると思いますのでスルー。
第二回のデータストアからという事で。

1.データの永続化を行うクラスの作成
データストアでは今までのRDBのように、SQLを発行して(全略)
といったようにデータの保存(永続化)を行う訳ではないようです。
JavaではJDOを利用する事で、とあるクラスのインスタンスが保持
しているデータをそのままデータストアに格納するらしい。

既にこの時点で割と意味不明だったんですが、途中で「そもそも
RDBという物を前提に考えてしまうのが恐らく間違い」と思い
とにかく言われた通りコードを書いてみる事にしました。

という訳でクラスをデータストアに保存するための条件は
以下の3点です。

・クラスに@PersistenceCapable(identifyType = IdentifyType.APPLICATION)アノテーションをつける
・メンバ変数にLong型のidを定義し、[@PrimaryKey] アノテーションと[@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)] アノテーションをつける
・永続化したいメンバ変数に@Persistenceアノテーションをつける

…この時点で、なんとなくLong型のIDって奴がKey-ValueのKeyの役割を果たしそうな
気がしますね。

2.クラスの永続化…の準備
次は上記のようにして作ったクラスを永続化する方法です。
永続化を行う際はPersistenceManagerクラスのmakePersistentメソッドを
使います。ただし、このPersistenceManagerクラスを生成するためには
PersistenceMangerFactoryクラスが必要なようです。
このPersistenceMangerFactoryクラスは永続化に必要な設定ファイル
(jdconfig.xmlファイルが作成したプロジェクトのsrc配下に作成される)
の情報を読み込むのですが、このxmlのパラーメータの名前が
"transactions-optional"なので、この文字列を指定します。
具体的には

 PersistenceManagerFactory pmfInstance = JDOHelper
.getPersistenceManagerFactory("transactions-optional");

こんな感じになります。ただ、データの永続化を行う度にこの
文字列を入力するのはバグの元になる上、この処理で生成される
ファクトリクラスは毎回同じ物になるのでstaticな変数として
定義します。以上によりPersistenceMangerFactoryを
生成するクラスは以下の通り。

public class PMF {
  private static final PersistenceManagerFactory pmfInstance = JDOHelper
    .getPersistenceManagerFactory("transactions-optional");

  private PMF() {
  }

  public static PersistenceManagerFactory get() {
    return pmfInstance;
  }

}

とりあえず現状は、データの永続化を行う際は必ず上記のような
ファクトリクラスを作る必要があるんだな、と覚えておくことにします。

3.クラスの永続化
1.と2.のステップをこなしていれば後は簡単。
PersistenceManagerクラスのインスタンスを生成し、makePersistent
メソッドに永続化対象のクラスを放り込むだけ。具体的には。

//PersistenceManagerクラスの生成
PersistenceManager pm = PMF.get().getPersistenceManager();
//永続化
pm.makePersistent([対象のインスタンス]);

これだけ。ただmakePersistentを実行する際には、永続化
終了後に必ずPersistenceManagerを閉じる処理が必要なので
実際には以下のようにして永続化を行う必要があります。

try {
  pm.makePersistent(e);
} finally {
  pm.close();
}

↑こういうコードはRDBの頃から腐るほど書いてる人が
多いと思うのでまぁ問題ないなと思います。
ってだからRDBと比較して考えちゃダメだーー(´・ω・`)

後はテキストの通り、作ったServletに対してPOSTするhtmlを
書いてTitleとContentに何か入力してPOSTしてみる。



こんな感じ。
試しにタイトルには"Testタイトル1"、Contentに"内容abc123bcd456"と
入力してPOSTしてみました。その後GAE管理画面からDataを見てみると・・



ちゃんと登録されている!
という訳でデータの永続化に成功しました。
今後これをどう使っていくかはまた今後という事で。

とりあえず今日の復習。

1.データの永続化を行いたいクラスは、決められた約束を守らなければならない。
・クラスに@PersistenceCapable(identifyType = IdentifyType.APPLICATION)アノテーションをつける
・メンバ変数にLong型のidを定義し、[@PrimaryKey] アノテーションと[@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)] アノテーションをつける
・永続化したいメンバ変数に@Persistenceアノテーションをつける
2.PersistenceManagerクラスを作る必要がある。(staticなファクトリクラスが便利)
3.後はPersistenceManagerクラスを用いて永続化対象クラスのインスタンスを永続化。

こんな所ですかね?
まともなアプリが作れるようになるのは遠い・・・

0 件のコメント: