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

blog1.mammb.com


に引き続き、EbeanでManyToOneのリレーションを定義してみます。といってもただのJPAですが・


Customerに、Address を属性として持たせ、ManyToOneでアノテート

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.ManyToOne;
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;
    
    @ManyToOne(cascade=CascadeType.ALL)
    Address billingAddress;

    ・・・以下アクセッサ
}

Addressは普通のEntity

import java.sql.Timestamp;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Version;

import com.avaje.ebean.annotation.CreatedTimestamp;
import com.avaje.ebean.validation.Length;

@Entity
@Table(name="o_address")
public class Address {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    Short id;

    @Length(max=100) @Column(name="line")
    String line;

    @Length(max=100)
    String city;

    @CreatedTimestamp
    Timestamp cretime;

    @Version
    Timestamp updtime;

    ・・・以下アクセッサ
}
}


ebean.propertiesには「ebean.debug.sql」を追加してみた。これにより発行されるSQLが表示されるようになります。

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

ebean.debug.sql=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


実行は以下

    @Test
    public void test() throws Exception {
        insertCustomer();
        
        Customer c = Ebean.getReference(Customer.class, 1);
        assertEquals("Thome", c.getName());
    }
    
    @Transactional
    public void insertCustomer() {
        Address a1 = new Address();
        a1.setCity("Tokyo");
        a1.setLine("99");

        Customer c = new Customer();
        c.setId(1);
        c.setName("Thome");
        c.setStatus(Customer.Status.NEW);
        c.setBillingAddress(a1);
        Ebean.save(c);
    }

作成テーブルとレコード

SELECT * FROM O_CUSTOMER;

STATUS NAME BILLING_ADDRESS_ID ID CRETIME UPDTIME
N Thome 1 1 2009-09-09 00:04:35.589 2009-09-09 00:04:35.589


SELECT * FROM O_ADDRESS;

ID LINE CITY CRETIME UPDTIME
1 99 Tokyo 2009-09-09 00:04:35.589 2009-09-09 00:04:35.589


特に問題なしと