KonifarPod

Playframework の Model で、永続化しないフィールドを宣言する方法

   

Pocket

Playframeworkは、Railsっぽく簡単にWebサービスを作れるJavaフレームワークです。ver2.0に上がってからはscalaベースになったのでJavaというよりはscalaですね。僕は前職で初めて使ってから、簡単にWebを作れる仕組みを気に入っています。Playを使うメリットについては、公式サイトのチュートリアルをやってみるとよくわかると思います。

PlayのDBまわりの基盤には、O/Rマッピングとしてhibernateが使われているのですが、ここでちょっとハマったので備忘がてら残しておこうと思います。

まあ一言で言うと、「永続化しないフィールドを定義する時は@Transientアノテーションをつけよう」という話です。

Playでは、DBのテーブルごとにplay.Modelクラスを継承して Entitiyモデルクラスを作ります。

・クラス名=テーブル名
・カラム名=フィールド名

という形にしておけば、xmlなどを書かなくてもよいのです。RailsのActiveRecordみたいなものです。

Modelクラスに定義されたフィールドは、全てテーブルのカラム名としてみなされます。他のクラス変数があるとhibernateのエラーが発生します。

 
Execution exception
PersistenceException occured : org.hibernate.exception.SQLGrammarException: could not load an entity 

 

Modelの中で永続化しないフィールドを宣言したい時には、@Transientアノテーションをつけることで実現できます。

@Entity
public class Message extends Model {
    public String title;
    public String content;
    public Date upd_date;
    @Transient
    public List list; 

 

そもそもPlayでは Modelの中にフィールドを持たせない方がいいのかもしれませんね。ただ、ListやBooleanを持たせた方がやりやすい場合もあるので、もし永続化しないフィールドを宣言したくなった時には@Transientを利用してみてはいかがでしょうか。

Pocket

 - Develop