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