id () не работает (не полностью) в Objectify

#google-app-engine #objectify

#google-app-engine #objectify

Вопрос:

Один из моих объектов имеет следующее объявление для своего идентификатора:

 @Id
private String                  oInstID;
public  String                  getInstID(){return oInstID;}
public void initID(){
    oInstID = OfyController.makeID(Partner.class, null);
}
  

Имейте в виду, что у меня такое же объявление и для других моих объектов.

У меня есть следующие инструкции для тестирования после ofy.save():

 Sticky persisted = OfyController.ofy().load().type(Sticky.class).first().now();
String id = persisted.getInstID();
Sticky queried = OfyController.ofy().load().type(Sticky.class).id(id).now();
Sticky queried2 = OfyController.ofy().load().entity(persisted).now();
  

Сохраненный объект вернул объект

Идентификатор вернул идентификатор объекта

Запрошенный результат вернул значение null…в этом и заключается моя проблема.

Запрошенный 2 вернул тот же объект, что и сохраненный

Есть идеи, почему запрос вернул null?

Спасибо!

Комментарии:

1. Точно ли вы представляете определение сущности ? Если у вас есть @Parent поле, это приведет к такому поведению. В этом коде нет ничего явно неправильного, поэтому опубликуйте полный пример, показывающий вашу операцию сохранения.

Ответ №1:

Мой предыдущий опыт работы с Objectify крошечный и очень устаревший, но то, что вы описываете, соответствует возможной согласованности. Есть немного полезной информации о хранении данных с помощью Objectify и Datastore.

Комментарии:

1. @Dave… что мой сценарий должен делать с возможной согласованностью? Просто к вашему сведению … приведенные выше инструкции по тестированию были написаны в JUnit, поэтому EC здесь не должен быть фактором. Спасибо!

2. EC является фактором, если вы используете JUnit для dev_appserver. Dev_appserver имитирует для вас возможную согласованность. Это третье утверждение эквивалентно SELECT * FROM Sticky WHERE id=? тому, которое полностью подчиняется EC.

3. Это неверно — load().type(t).id(i) — это то же самое, что создать ключ для {t,i} и выполнить получение по ключу. Это будет строго согласовано. Какова бы ни была проблема, это что-то другое.