【问题标题】:Loading child entities with JPA on Google App Engine在 Google App Engine 上使用 JPA 加载子实体
【发布时间】:2010-05-15 21:52:32
【问题描述】:

一旦子实体持久保存在 Google App Engine 上,我就无法加载它们。我确信它们正在保存,因为我可以在数据存储中看到它们。例如,如果我有以下两个实体。

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 解决了它?

【问题讨论】:

  • 您需要确保子列表在默认提取组中,还是只是 JDO?
  • 这是我一直看到的答案,但据我所知,这是 JDO。我确实在 JPA 中找到了一些关于获取组的信息,或者我想,但 GAE 似乎不支持该示例。我会再看一遍,但我怀疑就是这样。

标签: java google-app-engine jpa persistence google-cloud-datastore


【解决方案1】:

不要关闭实体管理器并调用子属性,这不是空的。懒惰的人只有在实体管理器打开时才能找到孩子。

【讨论】:

    【解决方案2】:

    我以前也遇到过同样的问题,尽管这似乎是一个奇怪的答案,但对我没有任何帮助,直到我改变了

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

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

    试一试,让我知道

    【讨论】:

      【解决方案3】:

      尝试在 @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);
      

      【讨论】:

      • 另外,我有在我的 jappstart 项目中使用 JPA 父/子关系的工作示例:jappstart.com
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2018-06-28
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多