我一直在为这个尴尬的时间敲打我的头,并感谢任何帮助。我认为这是一个简单的场景,我尝试检索和更新实体(如果存在),或创建新实体(如果它不存在)。有一个父实体,那部分似乎工作正常。我像这样创建子键:
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
答案 0 :(得分:3)
问题是你将Parent_Key与Key混淆。
这一行:
实体someChild = new Entity(CHILD_KIND,someKey);
创建一种类型的实体" CHILD_KIND"使用密钥的父实体" someKey"。有关详细信息,请参阅此文档[1]。
当您执行简单的datastore.get(key)时,您使用的是Entity自己的密钥,而不是父密钥。所以你需要做的是使用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
答案 1 :(得分:2)
您创建子实体的方式存在问题。它应该是:
Entity someChild = new Entity(CHILD_KIND, parent.getKey());
或
Entity someChild = new Entity(CHILD_KIND, child.getUniqueStringValue(), parent.getKey());
此外,我不确定您为何使用child.getUniqueStringValue()
而不是简单的Long ID,这会占用更少的空间。