【问题标题】:How to populate a ManyToMany relationship using YAML on Play Framework 2.1.x如何在 Play Framework 2.1.x 上使用 YAML 填充多对多关系
【发布时间】:2013-08-18 10:34:37
【问题描述】:

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

@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 没有成功。所有其他数据正在正确加载和显示。

【问题讨论】:

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


    【解决方案1】:

    您遇到的问题是因为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
    

    【讨论】:

    • 不幸的是,这不起作用。我修改了您的代码,并在尝试保存关系时收到 NullPointerException。我的yaml(chopapp.com/#bt5pwjvk)和loader方法(chopapp.com/#qy5dfec1
    • 您可能需要将 CascadeType.PERSIST 添加到您的收藏中。 @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) public List 角色 = new ArrayList();
    • 我将@ManyToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER) 添加到我的Proposal(相当于您的角色),但问题仍然存在......
    【解决方案2】:

    如果 Leon Radley 发布的答案是准确的,那就不再是这样了! Play 进化了,从 2.1 版本开始,manyToMany 引用初始化列表现在可以工作了 (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
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 1970-01-01
      • 2012-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-08
      相关资源
      最近更新 更多