2012-06-02 45 views
3

我正在使用initial-data.yml將一組樣本數據導入到我在Play 2.0.1上運行的應用程序中。我正在嘗試加載成員,計劃和會員資格。成員和方案導入OK,但成員資格(對成員和方案具有外鍵)只導入列表中的最後一個條目。使用initial-data.yml加載@ManyToOne關聯

這裏是我的初始data.yml文件:

# Members 

members: 

- !!models.Member 
    email:  [email protected] 
    name:  Mark Zucker 
    created: null 
    last_updated: null 

- !!models.Member 
    email:  [email protected] 
    name:  Vicky Smith 
    created: null 
    last_updated: null 

- !!models.Member 
    email:  [email protected] 
    name:  Simon Jones 
    created: null 
    last_updated: null 

- !!models.Member 
    email:  [email protected] 
    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:000 
    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 

如您所見,所有成員和方案都已加載,但只加載了一個成員資格。這總是列表中的最後一個(因此上面的initial-data.yml文件中的成員資格000)。如果我交換參賽作品,它仍然是最後一個!

爲了加載initial-data.yml中的所有成員數據,我需要更改哪些內容?

回答

3

在#Memberships下的initial-data.yml中,您有兩個'成員身份:',所以看起來第二個定義是被處理的定義。刪除第二個成員資格

+0

謝謝,是的,這是現在工作! – mstreffo

1

處理ebean的yaml引導文件中的manytoone關係的正確方法是創建引用。

這裏是你要引用的對象:

- !!models.User &ref 
    mail:  [email protected] 
    firstName: bbb 
    lastName: BBB 

的&裁判註釋是這裏引用的對象的別名。現在

你可以參考它:

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

的*裁判符號代表的 「與參考REF相關聯的對象」。這本書的主人將是BBB!

相關問題