モデルのアノテーション@Modelと@Attribute

@Attributeの実装が終わったようです。
Google グループ
そして、サンプルプロジェクトTODOサービスも@Attributeに対応しました。
Google Code Archive - Long-term storage for Google Code Project Hosting.
- プロジェクト名:todo-s3-datastore ・・・ Slim3 Datastoreを使ったTODOリストサービス

@Modelはclassに対して設定するアノテーションでkindというプロパティを持っています。このプロパティを付けなければデータストアに格納されるKindはモデル名になり、kind = "Test"というふうに明示するとKindがTestとして登録されることになります。

@Attributeではプロパティの名前を指定出きるようになったみたいで。@Attribute(name = "abc")とすると、定義したフィールド名と違う名前で保存されるようですね。また、この@Attributeをつけない場合はデフォルトで永続化対象となります。

というところで、変更したTodoモデルは以下のようになってます。

@Model
public class Todo {

    private static final long serialVersionUID = 1L;
    
    @Attribute(primaryKey = true)
    private Key key;
    
    @Attribute(persistent = false)
    private Category category;
    
    private String content;
    private Date createdAt;
    private Boolean done;
    // 略・・・

プライマリキーには「@Attribute(primaryKey = true)」こんな感じで設定しています。そして、永続化対象から外したいフィールドは「@Attribute(persistent = false)」といった感じ。ちなみに、このフィールドはCategoryという独自(StringとかDateとかじゃなく)のモデルなので、@Attributeアノテーションを付けないと、↓こんなエラーになる。Google App Engineでサポートされている型じゃないので、こういうエラーをSlim3-genが出してくれてる。

SILM3GEN1005] Specify @Attribute(lob = true) or @Attribute
 (persistent = false).

そして、このエラーの内容にしたがって永続化しないか、Blob(lob = trueにする)で保存するかを決める。
(Google App Engineで指定できるコアデータタイプは↓)
http://code.google.com/intl/ja/appengine/docs/java/datastore/dataclasses.html#Core_Value_Types
そして、@Attributeを指定してないフィールドはデフォルトで永続化対象ってことになります。

Blobとかバイトとかって単語を聞くとすぐ嫌になるけど、Slim3を使うとアノテーション付けるだけでシリアライズ、デシリアライズしてくるので楽ちんかも。さっきの永続化しないフィールドを下のようにするだけで、自動的にシリアライズして保存されるようになります。

@Attribute(lob = true)
private Category category;

そして、以下のURLから
http://localhost:8080/_ah/admin/datastore
保存されてるかかくにーんと思ったらBlobはここには出てこないみたい。でもしっかり保存されてるようでした。