シンプルなORMフレームワーク Ebean ORM Persistence Layer を試す

Ebeanとは

Ebean はシンプルなORMフレームワークです。マッピングにはJPAアノテーションが使えます。本家は以下
http://www.avaje.org/

簡単なサンプル

クラスパスに以下のライブラリを追加

  • ebean-2.0.2.jar
  • javax.persistence.jar
  • h2.jar

設定ファイル

Ebeanの設定ファイルをソースフォルダのルートに用意。以下の設定でddlの自動作成と自動実行が行われます。

ebean.ddl.generate=true
ebean.ddl.run=true

ebean.datasource.factory=default
datasource.default=ordh2

datasource.ordh2.username=sa
datasource.ordh2.password=
datasource.ordh2.databaseUrl=jdbc:h2:tcp://localhost:9092/test
datasource.ordh2.databaseDriver=org.h2.Driver

Entity

Entityの親クラスとして、Domainクラスを作成。

import java.sql.Timestamp;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Version;

import com.avaje.ebean.annotation.CreatedTimestamp;

@MappedSuperclass
public class Domain {

    @Id
    private Integer id;

    @CreatedTimestamp
    private Timestamp cretime;

    @Version
    private Timestamp updtime;

    ・・以下アクセッサ    
}


CustomerクラスをEntityにする。

import javax.persistence.Entity;
import javax.persistence.Table;

import com.avaje.ebean.annotation.EnumMapping;
import com.avaje.ebean.validation.Length;
import com.avaje.ebean.validation.NotNull;

@Entity
@Table(name="o_customer")
public class Customer extends Domain {
    private static final long serialVersionUID = 1L;

    @EnumMapping(nameValuePairs="NEW=N,ACTIVE=A,INACTIVE=I")
    public enum Status {
        NEW,
        ACTIVE,
        INACTIVE
    }

    Status status;
    @NotNull @Length(max=40) String name;

    public String getName() { return name; }
    public void setName(String name) { this.name = name; }

    public Status getStatus() { return status; }
    public void setStatus(Status status) { this.status = status; }
}

以上のように、JPAによるアノテーション付けます。

実行してみる

import static org.junit.Assert.*;
import org.h2.tools.Server;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;

import com.avaje.ebean.Ebean;
import com.avaje.ebean.annotation.Transactional;

public class Example {
    private static final String BASE_DIR = "db\\h2";
    private static Server tcpServer;
    private static Server webServer;
    
    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        tcpServer = org.h2.tools.Server.createTcpServer(
                new String[] { "-baseDir", BASE_DIR, "-tcpPort", "9092" }).start();
        webServer = org.h2.tools.Server.createWebServer(
                new String[] { "-baseDir", BASE_DIR, "-tcpPort", "8082" }).start();
    }

    @AfterClass
    public static void tearDownAfterClass() throws Exception {
        tcpServer.shutdown();
        webServer.shutdown();
    }

    @Test
    public void test() throws Exception {
        insertCustomer();
        
        Customer c = Ebean.getReference(Customer.class, 1);
        assertEquals("Thome", c.getName());
    }
    
    @Transactional
    public void insertCustomer() {
        Customer c = new Customer();
        c.setId(1);
        c.setName("Thome");
        c.setStatus(Customer.Status.NEW);
        Ebean.save(c);
    }
}

以上で、以下のようなCustomerテーブルが作成され、レコードが1件追加されます。

SELECT * FROM O_CUSTOMER;

STATUS NAME ID CRETIME UPDTIME
N Thome 1 2009-09-08 00:09:52.715 2009-09-08 00:09:52.715

SQLファイル

実行時に作成発行されるDDLはプロジェクトのルートに以下の2つのsqlファイルとして作成されます。

  • ordh2-create.sql
  • ordh2-drop.sql

中身はこない
ordh2-create.sql

create table o_customer (
  status                    varchar(1),
  name                      varchar(40) not null,
  id                        integer not null auto_increment,
  cretime                   timestamp,
  updtime                   timestamp,
  constraint ck_o_customer_status check (status in ('N','I','A')),
  constraint pk_o_customer primary key (id))
;


ordh2-drop.sql

SET REFERENTIAL_INTEGRITY FALSE;

drop table o_customer;

SET REFERENTIAL_INTEGRITY TRUE;

まとめ

非常にシンプルなつくりで好感が持てます。次回はEntity間のリレーションについて見ていきます。

blog1.mammb.com