我在我的Play应用程序中使用logisimayml 1.5模块从我的实时数据库中的内容生成yml。该模块遍历JPA类以识别子项以确定将哪些内容写入yml。
所以,如果我有两个这样的简单JPA类:
public class Parent extends Model {
@OneToMany(mappedBy = "parent", targetEntity = Child.class)
public List<Child> children;
...
}
public class Child extends Model {
@ManyToOne
@JoinColumn(name = "parent_id")
public Parent parent;
...
}
当我运行logisimayml时,它会生成一个如下所示的data.yml文件:
Parent(Parent_1):
name: Bill
children:
- Child_1
Parent(Parent_2):
name: Bill
Child(Child_3):
name: Jill
Child(Child_1):
name: Jill
parent: Parent_1
现在上面的yml确实代表了JPA类所代表的内容,但是我想使用data.yml文件加载到我的应用程序中:
Fixtures.loadModels("data.yml");
这不太有用,因为比尔是第一个,它想找到孩子吉尔。然而吉尔尚未宣布,因此它倒下了。这是因为我在Parent中使用了@OneToMany而在Child中使用了@ManyToOne,这意味着它是双向的。我可以删除@OneToMany但我仍然希望它在我的代码中。有没有人知道我可以做些什么来保持JPA类,但是在父和子之间没有无限循环的yml渲染?
更新:这是我在启动我的Play应用程序时看到的异常,该应用程序指向logisimayml创建的data.yml:
RuntimeException occured : Cannot load fixture data.yml: No previous reference found for object of type sites with key User_25
data.yml中的第一个对象将User_25引用为子级。 User_25的声明在我的data.yml中更进一步。正如Luffy在下面提到的,我简单的Parent-Child示例实际上并不会导致异常发生。我的实际项目有一个相当大的数据库,因此很难在这里用一个简单的例子进行复制,虽然我认为它与双向注释有关,但我想不是。我还为上面的例子更新了data.yml。我实际上做了路飞做的事情并用简单的Parent-Child示例创建了一个实际项目,在运行模块后,它实际上产生了一些与我手工制作的yml略有不同的东西。在Fixtures.loadModels(..)调用中使用该yml实际上是有效的,所以它并没有真正反映出我在生产中看到它的问题所以我将不得不回复你。
答案 0 :(得分:0)
尝试在ManyToOne注释中使用“fetch = FetchType.LAZY”。这可能有助于解决您的问题。
@ManyToOne(name = "parent_id", fetch = FetchType.LAZY)