まーぽんって誰がつけたの?

iOS→Scala→インフラなおじさん技術メモ

Play Framework 2.3 For Java ことはじめ #4 データベース接続(EBean)編

f:id:masato47744:20140720125846p:plainPlay Framework 2.3 For Java 入門記事一覧

第4回は、JDBCではなく、Play標準装備のORMであるEBeanを使ってデータベース接続します。

EBeanとは、JavaオープンソースのORMで主にPlay Frameworkで使われてるみたいです。

Ebean is an open source (LGPL license) Java Object Relational Mapping tool. It uses JPA Annotations (@entity, @OneToMany ...) for mapping. It provides a simple API for fetching and saving object graphs.

なにはともあれ、第3回のサンプルをEBeanで動くようにしていきます。

1. application.confの設定を変更する

チュートリアルに従いEBeanの設定をします。
以下の箇所がコメントアウトされてるのでコメントアウトを外す。

ebean.default="models.*"

2. モデルを作成する

次に、eclipse上でmodelsパッケージを作って、その下に、Member.javaを作る。
チュートリアルを参考にしながら、memberテーブル用のクラスを作る。idはさっきはなかったけどこういうauto incrementな値も扱いたいからいれておく。

package models;

import javax.persistence.Entity;
import javax.persistence.Id;

import play.db.ebean.*;
import play.data.validation.*;

@Entity 
public class Member extends Model {

  @Id
  @Constraints.Min(10)
  public Long id;
  
  @Constraints.Required
  public String name;
  
  public String email;
    
  public static Finder<Long, Member> find = new Finder<Long, Member>(
    Long.class, Member.class
  ); 

}

3. データ取得処理を書く

Application.javaに書いていたデータ取得処理をEBeanで取得するやり方に書き直す。
うん。直感的。

// 適当にデータ登録
Member member = new Member();
member.name = "hoge";
member.email = "hoge@example.com";
member.save();

// メンバー一覧取得してコンソールに出力
List<Member> members = Member.find.all();
for (Member member : members) {
    System.out.println(member.id + ":" + member.name + ":" + member.email);
}

4. Evloutionによる状態不一致の検出

これでブラウザからアクセスすると、memberテーブルにidなんてないぞっていわれる。そりゃそうだid列追加してないもん。
この不一致を検知する仕組みがPlay FrameworkのEvolutionという仕組みなんです。

簡単に説明すると、モデル作って@Entityってアノテーションしておけば、モデルの状態とテーブルの状態をチェックして、DDLまで作成して、さらにDDLの実行までやってくれる至れり尽くせりなやつ。
Railsやってる人はすぐイメージつくんじゃないかな。Railsdb:migrateの仕組みみたいなもので、コードでDDLの管理をするというもの。
Playの場合はplay_evolutionsというテーブルが作られてそこにマイグレーションの状態が登録されていく。Railsの場合は、schema_migrationsみたいな感じだよね。
ただ、Railsのmigrationと違うのは、コマンドラインからrake db:migrateみたいにコマンドで実行はできなくて、ブラウザからアクセスしたときに初めて実行されるというもの。ちょっとその辺はどっちかっていうと、Railsの仕組みの方が好きだなぁ。なんか長くなってしまった。とりあえずEvolutionはそういうものです。

5. テーブルきれいにしてEvolutionさせる

ということで、第3回で作ったテーブルをとりあえず削除するので、drop table member;しちゃう。
そして、ブラウザからアクセスすると、memberテーブルないけど私が作ったこのDDL流します?みたいなメッセージと実行するボタンがご丁寧に出てくるので、それを押す。そうすると、DDLが流れてテーブル作ってくれる。で、ちょっと待ってると画面が表示されるようになります。

ちなみに、このときのEvolutionされたときのDDLは、conf/evolutions/default/1.sqlってとこに勝手に出力されてます。sequenceとかちゃんとpostgreSQL用のsqlを出力してくれてますね。

1.sql

# --- Created by Ebean DDL
# To stop Ebean DDL generation, remove this comment and start using Evolutions

# --- !Ups

create table member (
  id                          bigint not null,
  name                     varchar(255),
  email                     varchar(255),
  constraint pk_member primary key (id))
;

create sequence member_seq;


# --- !Downs

drop table if exists member cascade;

drop sequence if exists member_seq;

まとめ

EBeanでの接続方法を知ろうと思っただけなのに、予期せずEvolutionという仕組みが入ってきたのでちょっと分かりにくくなってしまったかもしれません。とりあえず、Evolutionのことは忘れて、EBeanでのORMの書きやすさと設定の簡単さに着目してもらいたいです。

公式チュートリアルでは、次はJPAでの接続方法ですが、そのままではあれなので、公式サンプルソースで用意されているPlay with Spring Data JPA (Java)をもとにPostgreSQLで接続できるようにしてみます。ちなみに、JPAってなんなのかよく分かってないし、Spring Framework自体も触ったことないしどんなものか分かっていませんw

第5回はこちら -> Play Framework 2.3 For Java ことはじめ #5 データベース接続(Spring Data JPA)編