3

私は 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 のすべてのメンバーシップ データをロードするには、何を変更する必要がありますか?

4

2 に答える 2

3

# Memberships の下の initial-data.yml には、2 つの「memberships:」があるため、2 番目の定義が処理されるように見えます。2 番目のメンバーシップを削除する

于 2012-06-06T08:29:07.243 に答える
1

ebean の yaml ブートストラップ ファイルで多対一の関係を処理する正しい方法は、参照を作成することです。

参照するオブジェクトは次のとおりです。

- !!models.User &ref
    mail:      b@b.fr
    firstName: bbb
    lastName:  BBB

&ref 注釈は、ここで参照されるオブジェクトのエイリアスです。

これで参照できます:

- !!models.book
    owner:        *ref
    title:        myBook

*ref 記号は、「参照 ref に関連付けられたオブジェクト」を表します。本の持ち主はbbbです!

于 2014-08-13T16:39:39.920 に答える