以前は正常に動作していた 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) {続行; }
何か案は?