とりあえず雑記帳(跡地)
Modelを作る
最終更新:
fujiyan
-
view
Modelとはなんそや
- Slim3における「Model」とは、Datastoreに永続化する対象となるクラスです。
- 今回のアプリでは、(さしあたり)BookクラスとAuthorクラスに当たります。
- 或いは、DatastoreのEntityをタイプセーフにしたものです。
Model作成
- プロジェクトのルートにある、build.xmlをダブルクリックしてエディタに表示します。
- エディタ本体はまぁ無視して、Outlineビューに注目。表示していなければ、メニューの[Window]-[Show View]-[Outline]で表示しましょう。
- Outlineビューから[gen-model-with-dao]targetを選択して右クリック。コンテキストメニューの[Run As]-[Ant Build]を選択します。
- 「with-dao」とあるように、このtargetはModelと一緒に、そのModelのためのDao(後述)を作成します。
- ダイアログが表示されるので、作成するModelの名前を入力します。
- 入力した名前が、そのままクラス名になります。サブパッケージ名を一緒に指定することも可能です。
- [Root Package]がjp.fujiyan.booklistの場合
入力 | 作成されるクラスのFQCN |
Book | jp.fujiyan.booklist.model.Book |
sub.Book | jp.fujiyan.booklist.model.sub.Book |
- とりあえず、今回はBookと入力しておきます。こんなコードが生成されます。
package jp.fujiyan.booklist.model;
import java.io.Serializable;
import com.google.appengine.api.datastore.Key;
import org.slim3.datastore.Attribute;
import org.slim3.datastore.Model;
@Model(schemaVersion = 1)
public class Book implements Serializable {
private static final long serialVersionUID = 1L;
@Attribute(primaryKey = true)
private Key key;
@Attribute(version = true)
private Long version;
/**
* Returns the key.
*
* @return the key
*/
public Key getKey() {
return key;
}
/**
* Sets the key.
*
* @param key
* the key
*/
public void setKey(Key key) {
this.key = key;
}
/**
* Returns the version.
*
* @return the version
*/
public Long getVersion() {
return version;
}
/**
* Sets the version.
*
* @param version
* the version
*/
public void setVersion(Long version) {
this.version = version;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((key == null) ? 0 : key.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
Book other = (Book) obj;
if (key == null) {
if (other.key != null) {
return false;
}
} else if (!key.equals(other.key)) {
return false;
}
return true;
}
}
- Datastoreでの物理キーとなるkeyと、バージョン管理に利用されるversionが自動的に生成されます。
- 基本的に、生成されたコードに手を付けなければ、メンバの追加は自由に行って構いません。
永続化プロパティを定義する
- Datastoreに永続化するプロパティを定義する場合には、インスタンス変数とgetter/setterメソッドを定義します。
- BookにString型のプロパティtitleを定義する場合、こんなコードになります。場所はどこでもイイです。
private String title;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
Metaクラス?
- Modelを作成すると、[Root Package]直下に"meta"というサブパッケージが作成され、その中に[作成したModel名]Metaというクラスが自動生成されます。
- 今回の場合は、jp.fujiyan.booklist.meta.BookMetaクラス
- これらはMetaクラスと呼ばれます。ModelをDatastoreに永続化したり、プロパティで検索を行う場合等に必要な、補助オブジェクトを保持するものです。
- 基本的には、MetaクラスはSlim3フレームワークが利用するためのものです。
- 検索を行う際に、検索のキーとなるプロパティを指定する場合に、Metaが保持している、プロパティと同名のXXXAttributeMetaクラスの変数を利用するぐらいです。
- Modelを更新すると、自動的にMetaクラスも変更されます。
- 要するに、Metaクラスは弄らないでください。