使用Objectify的DataStore - 加载实体/键而不指定父级

时间:2016-06-16 12:06:44

标签: java google-app-engine google-cloud-datastore objectify

在一个事务中,我需要加载几个实体(十分之一百)并将这些实体分配给一个父实体,因此它们被视为一个实体组(否则我们无法将这些实体加载到一个实体组中)事务),这很好,但每当我们需要查询那些实体时,父实体被加载

ofy().load().type(clazz).parent(parent).ids(keys);

如果我们想要在没有加载父实体的情况下加载实体,那么这应该可以工作并加载实体,但它不会

ofy().load().type(clazz).ids(keys);

这背后的原因,如果两个或多个线程确实调用加载相同/不同的条目(但是父母相同),则会导致父实体上的负载过多。 java.util.ConcurrentModificationException:对这些数据存储区实体的争用过多。请再试一次。"

请咨询

2 个答案:

答案 0 :(得分:0)

ofy().load().type(clazz).ids(keys) 的原因是你没有指定父键 - 这相当于寻找<的键strong> root 实体(即实体没有父),这显然会产生不同的结果。

父键(实际上是整个祖先)嵌入在子实体键中,请参阅Ancestor paths

很遗憾,你必须指定父母 - &#34;加载&#34;父母(实际上是整个实体组,特别是写作业务)是在同一实体组内工作的优势所支付的代价。

答案 1 :(得分:0)

这个问题的根源是对事务和实体组在数据存储区中如何工作的基本误解。

官方文档很容易获取:

https://cloud.google.com/appengine/docs/java/datastore/transactions#Java_Entity_groups

我前段时间写过这篇文章,可能更容易理解:

https://github.com/objectify/objectify/wiki/Concepts

请记住,这不是关于加载父实体。它是关于在事务中登记实体组。如果您触摸该EG中的任何实体(即具有共同父键的任何实体),您已在该交易中征集了整个EG。