我一直为此感到尴尬,这很令人尴尬。我有一个简单的场景,我尝试检索和更新实体(如果存在),或者尝试创建一个不存在的实体。有一个父实体,该部分似乎工作正常。我这样创建子键:
Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue());
根据我阅读的文档,对此进行获取将返回该实体(如果存在):
Entity someChild = datastore.get(someKey);
但事实并非如此。相反,我必须这样做:
Query query = new Query(CHILD_KIND, someKey);
Entity someChild = datastore.prepare(query).asSingleEntity();
找到它。如果我尝试记录someKey.toString()值,则它们在创建过程中的外观与在搜索过程中的外观相同,但是如果我执行查询而不是get,它仍然只能找到它们。我缺少一些愚蠢而明显的东西,并且搜索在整个一周的时间里都无济于事,因此,我感谢您的帮助。
谢谢,
麦克风
编辑:
为了阐明我如何创建子实体,它是这样的:
Key someKey = KeyFactory.createKey(parent.getKey(), CHILD_KIND, child.getUniqueStringValue());
Entity someChild = new Entity(CHILD_KIND, someKey);
someChild.setProperty("desc", child.getUniqueStringValue());
someChild.setProperty("createTime", child.getCreateTime());
// and then a few more values that are timestamps or null
最佳答案
问题在于您将Parent_Key与Key混淆了。
这行:
实体someChild =新实体(CHILD_KIND,someKey);
用键“ someKey”的父实体创建“ CHILD_KIND”类型的实体。有关详细信息,请参见本文档[1]。
执行简单的datastore.get(key)时,您使用的是实体自己的密钥,而不是父密钥。因此,您需要做的是使用KeyFactory从其父项,种类,名称获取实体密钥。可以在此处[2]和此处[3]中找到详细信息。
[1]-https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/Entity
[2]-https://cloud.google.com/appengine/docs/java/datastore/entities#Java_Retrieving_an_entity
[3]-https://cloud.google.com/appengine/docs/java/javadoc/com/google/appengine/api/datastore/KeyFactory