Получение странной ошибки в коде Java Appengine, который работал нормально (ничего не изменилось, кроме данных в хранилище данных).
Я пытаюсь перебрать результаты запроса и изменить несколько свойств сущностей. Запрос возвращает набор результатов, однако, когда я пытаюсь получить доступ к первому результату в списке, он выдает исключение при попытке доступа к любому из его свойств (кроме его ключа). Вот исключение:
org.datanucleus.state.JDOStateManagerImpl isLoaded: Exception thrown by StateManager.isLoaded
Could not retrieve entity of kind OnTheCan with key OnTheCan(3204258)
org.datanucleus.exceptions.NucleusObjectNotFoundException: Could not retrieve entity of kind OnTheCan with key OnTheCan(3204258)
at org.datanucleus.store.appengine.DatastoreExceptionTranslator.wrapEntityNotFoundException(DatastoreExceptionTranslator.java:60)
А вот и мой код:
PersistenceManager pm = PMF.get().getPersistenceManager();
Query query = null;
List<OnTheCan> cans;
query = pm.newQuery("SELECT this FROM " + OnTheCan.class.getName() + " WHERE open == true ORDER BY onTheCanId ASC");
query.setRange(0, num);
cans = (List<OnTheCan>) query.execute();
for (OnTheCan c : cans)
{
System.err.println(c.getOnTheCanId()); // this works fine! getting the key works
c.setOpen(false); // failure here with the above exception
c.setAutoClosed(true);
c.setEndTime(new Date(c.getStartTime().getTime() + 600000/*10*60*1000*/));
}
pm.close();
Код выдает исключение при попытке выполнить c.setOpen (false) - это первый раз, когда я получаю доступ или задаю свойство, которое не является ключом. Похоже, в моем хранилище данных есть фантомная сущность с ключом 3204258. Эта сущность на самом деле не существует (запрашивает хранилище данных из консоли администратора), но по какой-то причине она возвращается запросом. Может ли мое хранилище данных находиться в несогласованном состоянии?
Я справился со следующим обходным решением, поместив его в качестве первой строки в цикле for. Очевидно, уродливый взломать:
if (c.getOnTheCanId () == 3204258) {
Продолжить;
}
Есть идеи?