私は initial-data.yml を使用して、一連のサンプル データを Play 2.0.1 で実行されているアプリケーションにインポートしています。メンバー、スキーム、およびメンバーシップを読み込もうとしています。メンバーとスキームは正常にインポートされますが、メンバーシップ (メンバーとスキームへの外部キーを持つ) はリストの最後のエントリのみをインポートします。
ここに私の initial-data.yml ファイルがあります:
# Members
members:
- !!models.Member
email: mark@zucker.com
name: Mark Zucker
created: null
last_updated: null
- !!models.Member
email: vickysmith@email.com
name: Vicky Smith
created: null
last_updated: null
- !!models.Member
email: sjones@yahoo.com
name: Simon Jones
created: null
last_updated: null
- !!models.Member
email: steve@james.com
name: Steve James
created: null
last_updated: null
# Schemes
schemes:
- !!models.Scheme
id: 1
name: Walmart
- !!models.Scheme
id: 2
name: Amazon
- !!models.Scheme
id: 3
name: Outdoors Living
# Memberships
memberships:
- !!models.Membership
membership_id: 1234567890
accrued: 2000
balance: 1000
joined_by: !!models.Member
id: 1
scheme: !!models.Scheme
id: 1
memberships:
- !!models.Membership
membership_id: 6543210000
accrued: 10000
balance: 10000
joined_by: !!models.Member
id: 2
scheme: !!models.Scheme
id: 1
私のモデル定義の関連部分は次のとおりです。
package models;
import java.util.*;
import play.db.ebean.*;
import play.data.Form;
import play.data.validation.Constraints.*;
import javax.persistence.*;
import models.Membership;
@Entity
public class Member extends Model {
@Id
public Long id;
@Required
public String email;
public String name;
public Date created;
public Date last_updated;
スキーム モデルの一部を次に示します。
@Entity
public class Scheme extends Model {
@Id
public Long id;
@Required
public String name;
メンバーシップ モデルは次のとおりです。
@Entity
public class Membership extends Model {
@Id
public Long membership_id;
@Required
@ManyToOne
public Member joined_by;
@Required
@ManyToOne
public Scheme scheme;
public Long accrued;
public Long balance;
Global.java の挿入メソッドは次のとおりです。
public static void insert(Application app) {
Map<String,List<Object>> all = (Map<String,List<Object>>)Yaml.load("initial-data.yml");
if(Ebean.find(Member.class).findRowCount() == 0) {
Logger.info("Loading members from initial-data.yml");
Ebean.save(all.get("members"));
}
if(Ebean.find(Scheme.class).findRowCount() == 0) {
Logger.info("Loading schemes from initial-data.yml");
Ebean.save(all.get("schemes"));
}
if(Ebean.find(Membership.class).findRowCount() == 0) {
Logger.info("Loading memberships from initial-data.yml");
Ebean.save(all.get("memberships"));
}
Logger.info("Loaded "+Ebean.find(Member.class).findRowCount()+" members");
Logger.info("Loaded "+Ebean.find(Scheme.class).findRowCount()+" schemes");
Logger.info("Loaded "+Ebean.find(Membership.class).findRowCount()+" memberships");
}
各テーブルに挿入された行数をカウントするようにログをオンに切り替えました。出力は次のとおりです。
DEBUG - select count(*)
from member t0
INFO - Loaded 4 members
DEBUG - select count(*)
from scheme t0
INFO - Loaded 3 schemes
DEBUG - select count(*)
from membership t0
INFO - Loaded 1 memberships
ご覧のとおり、すべてのメンバーとスキームが読み込まれていますが、1 つのメンバーシップのみが読み込まれています。これは常にリストの最後のものです (したがって、上記の initial-data.yml ファイルのメンバーシップは 6543210000 です)。エントリを入れ替えても、それは常に最後のエントリです!
initial-data.yml のすべてのメンバーシップ データをロードするには、何を変更する必要がありますか?