如何在Play Framework 2.1.x上使用YAML填充ManyToMany关系

时间:2013-08-18 10:34:38

标签: java many-to-many yaml playframework-2.1 ebean

我有以下ManyToMany(双向)关系:

@Entity
public class Proposal extends Model {
    ...
    @ManyToMany
    public List<Tag> tags;
}

@Entity
public class Tag extends Model {
    ...
    @ManyToMany(mappedBy="tags")
    public List<Proposal> taggedProposals;
}

我想使用yaml文件(稍后使用简单视图显示)使用一些测试数据填充我的数据库。这是我的yaml文件的一部分:

...
- &prop2 !!models.Proposal
    id:         2
    title:      Prop2 title
    proposer:   *user2

- &prop3 !!models.Proposal
    id:         3
    title:      Prop3 title
    proposer:   *user3

# Tags

- &tag1 !!models.Tag
    name: Tag1 name
    desc: Tag1 description
    taggedProposals:
        - *prop1

- &tag2 !!models.Tag
    name: Tag2 name
    desc: Tag2 description
    taggedProposals:
        - *prop2
        - *prop3

问题在于,当我尝试显示提案的tags或标记taggedProposals时,ArrayLists为空!我尝试使用square brackets and commas但没有成功。正在加载和显示所有其他数据。 My test view

2 个答案:

答案 0 :(得分:4)

您遇到的问题是因为Play使用ebean而ebean不能自动保存多对多关联。

我必须这样解决:

private static void initialData() {
    @SuppressWarnings("unchecked")
    Map<String,List<Object>> all = (Map<String,List<Object>>) Yaml.load("initial-data.yml");

    // Save all roles
    Ebean.save(all.get("roles"));

    // Insert users and for every user save its many-to-many association
    Ebean.save(all.get("users"));
    for(Object user: all.get("users")) {
        Ebean.saveManyToManyAssociations(user, "roles");
    }
}

和yaml文件:

# Roles
roles:
  - &adminRole !!models.Role
    name: admin

  - &projectleadRole !!models.Role
    name: projectlead

# Users
users:
  - &leonUser !!models.User
    email: leon@domain.com
    roles:
     - *adminRole
     - *projectleadRole
    firstName: Leon
    lastName: Radley

答案 1 :(得分:2)

如果Leon Radley发布的答案是准确的,那就不再是这样了! Play进化了,自2.1版本开始,很多ToMany引用按列表初始化工作(see this link)!有关其工作原理的示例,请参阅User.zones。

zones:
    - &zone1 !!models.Zone
        id:                 1
        gtbName:            "ZZ01"
    - &zone2 !!models.Zone
        ...

users:
    - &user4 !!models.User
        id:                 4
        profile:            *profile4
        defaultZone:        *zone3
        zones:
            - *zone1
            - *zone2
            - *zone3