前回、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) アノテーションをつける事で永続化できます。インデックスは作成されません。
- シリアライズ可能( implements Serializable 的な )クラス
- バイト配列( byte[]な )クラス
- 長いテキスト文字列(500バイトより大きいString型)
- コレクション
- 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の有難味が分かり始める予感。
を読みながら、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); } }