Appengine datastore phantom entity - inconsistent state?

Posted by aloo on Stack Overflow See other posts from Stack Overflow or by aloo
Published on 2010-06-13T17:56:28Z Indexed on 2010/06/13 18:02 UTC
Read the original article Hit count: 456

Getting a weird error on java appengine code that used to work fine (nothing has changed but the data in the datastore).

I'm trying to iterate over the results of a query and change a few properties of the entities. The query does return a set of results, however, when I try to access the first result in the list, it throws an exception when trying to access any of its properties (but its key). Here's the exception:

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)

And here is my code:

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();

The code throws the exception when trying to execute c.setOpen(false) - thats the first time I'm accessing or setting a property that isnt the key. So it seems there is a phantom entity in my datastore with key 3204258. THis entity doesn't really exist (queried the datastore from admin console) but for some reason its being returned by the query. Could my data store be in an inconsistent state?

I've managed the following workaround by placing it as the first line in my for loop. Clearly an ugly hack:

if (c.getOnTheCanId() == 3204258) {
    continue;
}

Any ideas?

© Stack Overflow or respective owner

Related posts about java

Related posts about query