我正在尝试在应用程序启动期间借助Fixtures.loadModels()加载数据(@OnApplicationStart) 我的数据文件很简单,但我不断收到有关重复ID的错误。但是,根本没有重复的ID。
Category(auto):
idEng: "auto"
title: "Auto"
Group(crossover):
idEng: "crossover"
title: "Crossovers"
parentCategory: auto
相应的类是:
@Entity
public class Category extends Model {
public String idEng;
public String title;
@OneToOne
public Category parentCategory;
}
@Entity
@Table(name="ItemGroup")
public class Group extends Model {
@Column(length=64)
public String idEng;
@Column(length=64)
public String title;
@ManyToOne
public Category parentCategory;
}
有时它在我开始游戏之后才有效,但肯定是第二次加载数据。我收到错误:
RuntimeException occured : Cannot load fixture categories.yml:
Cannot load fixture categories.yml, duplicate id 'auto' for type models.Category
有谁知道这里有什么问题吗? 有没有人遇到过这样的问题?
答案 0 :(得分:5)
我稍微调试了一下,找到了原因:在Fixtures.idCache中播放加载实体的id。所以在启动后的第一次它工作正常,因为缓存是空的。但是,当Play重新创建数据库并尝试第二次加载数据时,缓存已包含给定的ID,而Play会抛出异常。它发生在下面的一段代码中(Fixtures.loadModels(String name),第185-187行):
if (idCache.containsKey(type + "-" + id)) {
throw new RuntimeException("Cannot load fixture " + name + ", duplicate id '" + id + "' for type " + type);
}
要清除缓存,必须调用Fixtures.delete()或Fixtures.deleteDatabase()。这些方法清除了idCache变量。
要解决我的问题,我刚刚在Fixtures.loadModels()之前添加了Fixtures.delete()的调用
答案 1 :(得分:0)
我现在无法测试它,但我会说问题是@OneToOne注释。它期望目标类具有反向映射,并且在这种情况下它不存在。您应该能够添加一个新属性来管理关系另一端的映射,here您可以找到更多详细信息
另外,你确定要一个@OneToOne rel,而不是@OneToMany吗?我看不出一个类别如何只能有一个父母和一个孩子,而不是一个父母和多个孩子......