4

我無法讓子實體在Google App Engine上持久保存後加載。我確信他們正在保存,因爲我可以在數據存儲中看到它們。例如,如果我有以下兩個實體。在Google App Engine上使用JPA加載子實體

public class Parent implements Serializable{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String key; 
    @OneToMany(cascade=CascadeType.ALL) 
    private List<Child> children = new ArrayList<Child>(); 

    //getters and setters 
} 

public class Child implements Serializable{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Extension(vendorName="datanucleus", key="gae.encoded-pk", value="true") 
    private String key; 
    private String name; 
    @ManyToOne 
    private Parent parent; 
    //getters and setters 
} 

我可以拯救父母和孩子就好使用下列內容:

Parent parent = new Parent(); 
Child child = new Child(); 
child.setName("Child Object"); 
parent.getChildren().add(child); 
em.persist(parent); 

然而,當我嘗試加載父,然後嘗試訪問的孩子(我知道GAE延遲加載)我沒有得到孩子的記錄。

//parent already successfully loaded 
parent.getChildren.size(); // this returns 0 

我看過教程後的教程,沒有任何工作到目前爲止。我正在使用SDK的1.3.3.1版本。我已經看到了各種博客甚至App Engine論壇上提到的問題,但答案始終與JDO相關。我做錯了什麼或者有其他人有這個問題,並解決它的JPA?

+0

你需要確保兒童的列表是在默認的抓取組,還是隻是JDO? – Finbarr 2010-05-15 23:22:45

+0

這就是我一直看到的答案,但據我所知,這是JDO。我確實在JPA中找到了一些關於獲取組的內容,所以我想但是這個例子似乎沒有被GAE支持。我會再看看那個,但我懷疑就是這樣。 – 2010-05-16 02:50:08

回答

0

試穿@OneToMany批註加入的mappedBy象下面這樣:

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL) 
private List<Child> children = new ArrayList<Child>(); 

此外,你應該在下面添加到@ManyToOne批註:

@ManyToOne(fetch = FetchType.LAZY) 

而且,我覺得有用使用Google Key和KeyFactory類,因爲您可以在創建子密鑰時明確設置父級。

this.key = KeyFactory.createKey(parentKey, getClass().getSimpleName(), name); 
+0

另外,我有我的jappstart項目中使用JPA父/子關係的工作示例:http://jappstart.com – 2010-05-17 18:52:46

2

不要關閉實體管理器並調用子屬性,這不是空的。只有在實體管理器處於打開狀態時,懶惰纔會找到孩子。

1

我已經收到了同樣的問題,儘可能這似乎爲奇了怪了答案,但沒有爲我工作,直到我改變了

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL) 

@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST) 

給它一個鏡頭,並讓我知道

相關問題