编程语言
首页 > 编程语言> > 在GoogleEngine(Java)上,在JDO中,如何根据父ID来查询子对象列表?

在GoogleEngine(Java)上,在JDO中,如何根据父ID来查询子对象列表?

作者:互联网

我有两个值对象,日历和事件,它们是持久的.日历的属性包含一个事件列表,具有一对多关系.日历是活动的父项,如下所示.

@Persistent
@Element(dependent = "true")
private List<Event> events;

现在,我希望能够基于Calendar对象键通过JDO查询检索与Calendar对应的事件.我对两个类都使用encodedKey.

我想在事件实体上运行查询,而不仅是检索整个Calendar对象,因为我希望只能够检索一组事件,以便进行分页.

我试图以任何可能的方式执行此操作,无法弄清楚如何通过父键进行查询.

任何帮助,将不胜感激.

解决方法:

一些注意事项:

实体中的列表属性(如您的List< Event>事件)存储为序列化的ProtocolBuffer.问题是:

>如果对该属性建立索引,则它们最多可包含5000个元素.
>每次查询列表时,都需要反序列化整个列表.如果您可以有选择地检索列表元素,那么这就是您的问题的答案:不能.
>如果实体中具有多个索引列表属性,则可能导致Exploding Indexes.

如果您想了解GAE数据存储的内部原理,则必须使用以下视频:http://www.youtube.com/watch?v=AgaL6NGpkB8

解决方案:

>使用Slatkin的视频中的解决方案:将Calendar设为Event的父项(以数据存储为术语).然后向查询添加父条件:Query.setAncestor(Key calendarKey).

更新:实体父关系应用于创建“实体组”,例如交易范围的单位.
>扭转情况:创建具有Calendar属性的Event实体,该Calendar属性指向事件所属的Calendar.然后,您可以简单地查询具有“ calendar == calendarKey”的事件.

标签:jdo,google-app-engine,parent-child,java
来源: https://codeday.me/bug/20191102/1994751.html