2014-12-09 3 views
0

Я бил головой об этом в течение неловкого времени и ценю любую помощь. У меня есть то, что я считаю простым сценарием, где я пытаюсь получить и обновить сущность, если она существует, или создать новое, если это не так. Существует родительская сущность, и эта часть работает нормально. Я создаю ключ ребенка, как это:Datastore не нашел запись по ключевому слову

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. Мне не хватает чего-то глупого и очевидного, и поиск застал меня никуда в течение недели, поэтому я ценю любую помощь.

Спасибо, Майк

Edit:

Чтобы уточнить, как я создаю дочерний объект, это так:

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

Как создать свой дочерний объект? –

+0

Привет, Андрей, я редактировал сообщение, чтобы включить, как я создаю ребенка. Благодарю. –

ответ

3

Проблема в том, что вы вводите в заблуждение Parent_Key с ключом.

Эта линия:

Сущность someChild = новый орган (CHILD_KIND, someKey);

Создает объект типа "CHILD_KIND" с родительским объектом ключа "someKey". Подробнее см. В этом документе [1].

Когда вы делаете простой файл datastore.get (ключ), вы используете собственный ключ Entity, а не родительский ключ. Итак, что вам нужно сделать, это использовать KeyFactory, чтобы получить ключ Entity от его родительского ключа, типа, имени. Подробности можно найти здесь [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

+0

Спасибо! Да, я неправильно понял это в документации. –

1

Существует проблема в том, как вы создаете дочернего объекта. Оно должно быть:

Entity someChild = new Entity(CHILD_KIND, parent.getKey()); 

или

Entity someChild = new Entity(CHILD_KIND, child.getUniqueStringValue(), parent.getKey()); 

Кроме того, я не уверен, почему вы используете child.getUniqueStringValue() вместо простого Long идентификатора, который занимает меньше места.

+0

Спасибо, Андрей. УникальныйStringValue является заполнителем для некоторых данных, которые я пытаюсь сохранить. Он должен быть уникальным для родителя, но он содержит информацию о ценности для пользователя, поэтому он не является идентификатором как таковым. –

Смежные вопросы