我有以下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但没有成功。正在加载和显示所有其他数据。
答案 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