に引き続き、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 |
特に問題なしと