У меня возникла проблема с извлечением объектов из Google Cloud Datastore с помощью JDO. Это невероятно сложно, потому что 99,5% времени мой код работает отлично, но в 0,5% случаев некоторые из данных отсутствуют, и я не могу найти последовательные шаги для репликации ошибки. Я уверен, что моя проблема связана с тем, как я настроил свою модель или как я запрашиваю хранилище данных (у меня есть подозрение, что это может быть связано с ленивой загрузкой или группой выборки по умолчанию, м не уверен).Строки, которые иногда не извлекаются с помощью запроса облачного хранилища данных (GAE, JDO, Endpoints, Java)
Прежде чем я объясню, что происходит, это поможет понять модель.
Вот упрощенная версия моей модели:
@PersistenceCapable
@Inheritance(customStrategy = "complete-table")
public class DataObject {
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY, defaultFetchGroup="true")
protected Key theKey;
@Persistent()
protected String name;
//...
}
@PersistenceCapable
public class Class1 extends DataObject{
@Persistent()
@Element(dependent="true")
private List<Class2> listOfClass2 = new ArrayList<Class2>();
//...
}
@PersistenceCapable
public class Class2 extends DataObject{
@Persistent()
@Element(dependent="true")
private List<Class3> listOfClass2 = new ArrayList<Class3>();
//...
}
@PersistenceCapable
public class Class3 extends DataObject{
@Persistent()
private String value;
//...
}
А вот код, который используется для запроса хранилища данных:
public class DataManager {
public DataObject get(
User user,
Class type,
Long id) throws OAuthRequestException
{
PersistenceManager mgr = getPersistenceManager();
DataObject obj = null;
try
{
obj = mgr.getObjectById(type, id);
getAllChildren(obj);
}
finally
{
mgr.close();
}
if(obj != null)
{
return obj;
}
else
{
throw new EntityNotFoundException("Entity not found");
}
}
/**
* Returns all of the children of the given object
* and their children etc. It is intended to 'touch' every object
* in the tree to accommodate for lazy loading.
*/
private List<StoredDataObject> getAllChildren(DataObject obj)
{
//...
}
}
Проблема заключается в том, что очень редко, то запрос будет возвращается со всеми полями «имя» на заданном уровне пустым. Например, если я получаю объект класса 1, все дочерние объекты класса 2 будут иметь атрибут «name», равный «». Данные, безусловно, находятся в хранилище данных, потому что, если я снова запустим запрос, они будут заполнены правильно. Я никогда не видел никаких других атрибутов пустым, только поле имени. Иногда это происходит на уровне Class2, иногда Class3, но никогда Class1 (насколько я видел).
Насколько я понимаю, любые атрибуты String должны автоматически включаться в группу выборки по умолчанию, но мне, возможно, не хватает аннотации, которая заставляет атрибут «name» извлекаться каждый раз?
Новое наблюдение. Когда это произойдет, оно будет происходить последовательно в течение примерно 15 минут, пока я запускаю тот же запрос с одинаковыми учетными данными пользователя. Может ли это быть чем-то связанным с кешированием?
Почему это должно быть из-за ленивой загрузки или dfg? Строковое поле находится в DFG. Скорее всего, из-за «странностей» используемого вами хранилища данных. Возможно, посмотрите на журнал –
Я не уверен, возможно, я ошибаюсь, глядя на них. В журналах ничего нет, что говорит о проблеме, насколько я могу видеть – Tom
Я не знаю Java, но вы принимаете во внимание последовательность? –