由于错误的重复ID检测,无法加载夹具

时间:2011-06-07 14:23:27

标签: playframework

我正在尝试在应用程序启动期间借助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 

有谁知道这里有什么问题吗? 有没有人遇到过这样的问题?

2 个答案:

答案 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吗?我看不出一个类别如何只能有一个父母和一个孩子,而不是一个父母和多个孩子......