前回、slim3とVelocityのインストールをして、Controllerクラスを作ってみました。

その続きです。

 


Modelクラスの作成

  • パッケージ・エクスプローラにてプロジェクト直下の build.xml をダブルクリックする
  • 右側のアウトライン・ビューにて、[gen-model]タスク※を右クリックする。

    ※[gen-model]が複数ある場合は、◎みたいなアイコンの方

  • [実行®] – [1 Ant ビルド Alt+Shift+X, Q] (1番目の項目) をクリックする

  • [構成の編集]ダイアログにて、[gen-controller[デフォルト]]のチェックを外し、[gen-model]にチェックを入れ、[実行®]ボタンをクリックする。

  • [Ant Input Request]にて、任意の文字列 (例:Member)を入力する

  • 下記ファイルが生成されている事を確認する。

    • src/my/package/model/Member.java
    • test/my/package/model/MemberTest.java

 

実に簡単です。

 

  • あとは、フィールドとかゲッターとかセッターとかを必要に応じて付け足します。

    永続化するフィールドに @Persistent アノテーションは要りません。

    フィールドを永続化したくない場合は、

    @Attribute(persistent = false)

    アノテーションをつけます。

  • 明示的にインデックスづけを中止するアノテーションもあります。

    @Attribute(unindexed = true)

  • 以下のものについては、@Attribute(lob = true) アノテーションをつける事で永続化できます。インデックスは作成されません。

    1. シリアライズ可能( implements Serializable 的な )クラス
    2. バイト配列( byte[]な )クラス
    3. 長いテキスト文字列(500バイトより大きいString型)
    4. コレクション

      • java.util.ArrayList<…>
      • java.util.LinkedList<…>
      • java.util.HashSet<…>
      • java.util.LinkedHashSet<…>
      • java.util.TreeSet<…>
      • java.util.List<…>
      • java.util.Set<…>
      • java.util.SortedSet<…>

 


1対多の Modelクラスを実装する

さきほどこさえたMemberクラスに対し、Circleクラスをこさえて 1対多のリレーションを実現します。

いよいよ、slim3の有難味が分かり始める予感。

リレーションシップ (Slim3 日本語サイト(非公式))

を読みながら、eclipseのエラーメッセージに従い実装していくと、結果こうなりました。

private ModelRef<Circle> circles = new ModelRef<Circle>(Circle.class);
public ModelRef<Circle> getCircles() {
    return circles;
}

ドキュメントによると、保存はこんな感じ。

Circle circle = new Circle();
Member member = new Member();
member.getCircles().setModel(circle);
Datastore.put(circle, member);

参照はこんな感じ。

Key memberKey = ...;
Member member = Datastore.get(Member.class, memberKey);
Circle circle = member.getCircles().getModel();

うん。覚えやすそうです。

関連(例では多の方のCircle)はレイジーにロードされるそうです。

 


Serviceクラスの作成

  • パッケージ・エクスプローラにてプロジェクト直下の build.xml をダブルクリックする
  • 右側のアウトライン・ビューにて、[gen-service]タスク※を右クリックする。

    ※[gen-service]が複数ある場合は、◎みたいなアイコンの方

  • [実行®] – [1 Ant ビルド Alt+Shift+X, Q] (1番目の項目) をクリックする

  • [構成の編集]ダイアログにて、[gen-controller[デフォルト]]のチェックを外し、[gen-service]にチェックを入れ、[実行®]ボタンをクリックする。

  • [Ant Input Request]にて、任意の文字列 (例:MemberService)を入力する

  • 下記ファイルが生成されている事を確認する。

    • src/my/package/service/MemberService.java
    • test/my/package/service/MemberServiceTest.java

 

Serviceに関する説明は、今の所Slim3公式サイトにもSlim3 日本語サイト(非公式))にもありません。

slim3-demoをチェックアウトして、ソースコードを見てみる事をオススメします。

実に判りやすいです。

永続化層の操作を中心としたビジネスロジックをServiceで実装して、Controllerで利用すれば良いと思います。

とりあえずは、slim3-demoを参考にして、CRUDを実装しときます。

必要に応じてあとで付け足すことにします。

public class MemberService {

    private MemberMeta mMeta = MemberMeta.get();

    public Member get(Key key, Long version) {
        return Datastore.get(mMeta, key, version);
    }

    public List<Member> getAll() {
        return Datastore.query(mMeta).asList();
    }

    public void insert(Member member) {
        SLog.log.info("insert ("+ member.getClass().getName() + ")");
        Transaction tx = Datastore.beginTransaction();
        Datastore.put(tx, member);
        Datastore.commit(tx);
    }

    public Member update(Key key, Long version, Map<String, Object> input) {
        SLog.log.info("update()");
        Transaction tx = Datastore.beginTransaction();
        Member member = Datastore.get(tx, mMeta, key, version);
        BeanUtil.copy(input, member);
        Datastore.put(tx, member);
        Datastore.commit(tx);
        return member;
    }

    public void delete(Key key, Long version) {
        SLog.log.info("delete member ()");
        Transaction tx = Datastore.beginTransaction();
        Member member = Datastore.get(tx, mMeta, key, version);
        Datastore.delete(tx, member.getKey());
        Datastore.commit(tx);
    }
}

 


次回は、更新系のControllerを作りこんだり、バリデーションチェックをしたりします。