2012-01-12 78 views
0

我在我的Play應用程序中使用logisimayml 1.5模塊從我的活動數據庫中的內容生成yml。該模塊遍歷JPA類來識別孩子以確定寫入yml的內容。在Play Framework中使用logisimayml模塊

所以,如果我有兩個簡單的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。我實際上做了Luffy所做的事情,並用簡單的Parent-Child示例創建了一個實際項目,並在運行該模塊之後,實際上產生了與我手工製作的yml稍有不同的東西。在Fixtures.loadModels(..)調用中使用這個yml實際上可以工作,但它並不完全如我在生產中看到的那樣反映問題,所以我將不得不再次回到你。

回答

0

嘗試在ManyToOne批註中使用「fetch = FetchType.LAZY」。這可能有助於解決您的問題。

@ManyToOne(name = "parent_id", fetch = FetchType.LAZY) 
+0

在我的實際代碼中,我有lazy的獲取類型。我只是沒有在OP的例子中加入它。 – digiarnie 2012-01-12 06:42:36

+0

這很奇怪,我只是在新的遊戲項目中測試你的senario。它的加載簡單的例子yml在boostrap成功。我在那裏查了數據庫賬單和jill。我正在使用遊戲1.2.4。我手動創建yml文件。使用postgresql進行測試。 – Luffy 2012-01-12 07:21:37

+0

你是對的。我在OP中放入的簡單例子實際上很有用。我的大型應用程序與大型XML仍然無法正常工作。我將不得不回到一個實際複製我看到的問題的例子。感謝您在我的超級簡單示例中找到這個問題! – digiarnie 2012-01-12 07:38:51

相關問題