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) 

给它一个镜头,并让我知道

相关问题