EbeanORMは、クラスにフィールドを定義すれば自動的にテーブルを作成したり書き換えてくれたりする便利なものです。
今回は、タイムスタンプなど、全てのテーブルで共通して利用できるフィールドを作成してみましょう。
スーパークラスを定義する
共通項目を定義していきます。候補としては、各種タイムスタンプなどが挙げられます。
- createdDate
- modifiedDate
- deletedDate
このあたりはよくある項目ですね。それでは、実際にモデルを定義してみましょう。
package models;
import javax.persistence.*;
import java.sql.*;
import com.avaje.ebean.Model;
@MappedSuperclass
public class AbstractModel extends Model {
Timestamp createdDate;
Timestamp modifiedDate;
Timestamp deletedDate;
}
これがmodelクラスのスーパークラスとなります。
@MappedSuperclass
アノテーションが付与されたクラスは、フィールドが継承先のテーブルに反映されるようになります。
試してみる
それでは、実際にAbstractModelを継承して、新しいmodelクラスを作ってみましょう。
package models;
import java.util.*;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import com.avaje.ebean.Model;
import play.data.format.*;
import play.data.validation.*;
@Entity
public class User extends AbstractModel {
@Id
public Long id;
@NotNull
@Column(unique=true)
public String userName;
@NotNull
public String password;
@NotNull
public String fullName;
public static Finder<Long, User> find = new Finder<Long,User>(User.class);
}
アプリケーションをリロードすると、親クラスから先ほど定義したフィールドが継承されていることが分かります。
まとめ
タイムスタンプなどの項目は、殆ど全てのテーブルに必要な項目なので、こうして親クラスで纏めて定義できるのは便利ですね。
うまく使ってコーディングのコスト削減を目指していきたいものです。