4

我有以下多对多(双向)关系:

@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

问题是,当我尝试显示 Proposal'stags或 Tag'staggedProposals时,ArrayLists 是空的!我尝试使用方括号和逗号但没有成功。所有其他数据正在正确加载和显示。我的测试视图

4

2 回答 2

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
于 2013-08-19T07:19:17.223 回答
2

如果 Leon Radley 发布的答案是准确的,那就不再是这样了!Play 进化了,从 2.1 版本开始,manyToMany 引用初始化列表现在可以工作了(见这个链接)!有关其工作原理的示例,请参见 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
于 2014-08-13T16:43:44.407 回答