Playframework 无法加载夹具,因为检测到错误的重复id

Playframework 无法加载夹具,因为检测到错误的重复id,playframework,Playframework,我正试图在应用程序启动(@OnApplicationStart)期间借助fixture.loadModels()加载数据 我的数据文件非常简单,但我不断地得到关于重复id的错误。然而,根本没有重复id Category(auto): idEng: "auto" title: "Auto" Group(crossover): idEng: "crossover" title: "Crossovers" parentCategory: auto 相应的类别为: @Entity

我正试图在应用程序启动(@OnApplicationStart)期间借助fixture.loadModels()加载数据 我的数据文件非常简单,但我不断地得到关于重复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 
有人知道这里出了什么问题吗?
以前有人遇到过这样的问题吗?

我现在无法测试它,但我想说问题在于@OneToOne注释。它期望目标类具有反向映射,在本例中,它不存在。您应该能够添加一个新属性来管理关系另一端的映射,您可以找到更多详细信息


还有,你确定你想要的是一个@OneToOne rel,而不是@OneToMany?我看不出一个类别如何只能有一个父项和一个子项,而不是一个父项和多个子项…

我现在无法测试它,但我想说问题在于@OneToOne注释。它期望目标类具有反向映射,在本例中,它不存在。您应该能够添加一个新属性来管理关系另一端的映射,您可以找到更多详细信息


还有,你确定你想要的是一个@OneToOne rel,而不是@OneToMany?我看不出一个类别如何只能有一个父级和一个子级,而不是一个父级和多个子级…

我对它进行了一点调试,找到了原因:Play cache在Fixtures.idCache中缓存加载实体的ID。因此,在启动后的第一次,它可以正常工作,因为缓存是空的。但是,当Play重新创建数据库并尝试第二次加载数据时,缓存已经包含给定的ID,Play将抛出异常。它发生在以下代码段(Fixtures.loadModels(字符串名称),第185-187行):

要清除缓存,需要调用Fixtures.delete()或Fixtures.deleteDatabase()。这些方法清除idCache变量


为了解决我的问题,我刚刚在Fixtures.loadModels()之前添加了Fixtures.delete()调用,我对其进行了一些调试,并找到了原因:Play caches在Fixtures.idCache中缓存加载实体的ID。因此,在启动后的第一次,它可以正常工作,因为缓存是空的。但是,当Play重新创建数据库并尝试第二次加载数据时,缓存已经包含给定的ID,Play将抛出异常。它发生在以下代码段(Fixtures.loadModels(字符串名称),第185-187行):

要清除缓存,需要调用Fixtures.delete()或Fixtures.deleteDatabase()。这些方法清除idCache变量


为了解决我的问题,我刚刚在fixture.loadModels()之前添加了fixture.delete()调用。

谢谢你的建议,我在代码中修复了这个问题。但是,原因不同。谢谢你的建议,我在代码中修复了这个问题。然而,原因不同。
if (idCache.containsKey(type + "-" + id)) {
   throw new RuntimeException("Cannot load fixture " + name + ", duplicate id '" + id + "' for type " + type);
}