我正在尝试使用以下代码写入 JDO 存储:
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.currentTransaction().begin();
// deactivate all for current domain
Query q = pm.newQuery(CampaignStore.class, "domain == '" + domain +"'");
Collection result = (Collection) q.execute();
CampaignStore toBeEdited = null;
Iterator iter = result.iterator();
while (iter.hasNext()) {
toBeEdited = (CampaignStore) iter.next();
toBeEdited.setActive(false);
}
result.clear();
// set new one active
q = pm.newQuery(CampaignStore.class, "id == " + id);
result = (Collection) q.execute();
toBeEdited = (CampaignStore) result.iterator().next();
if (toBeEdited == null) {
LOG.log(Level.WARNING, "setActiveCampaign: Unable to find Campaign ID '"+ id +"'");
pm.currentTransaction().rollback();
return;
}
toBeEdited.setActive(true);
pm.currentTransaction().commit();
LOG.log(Level.INFO, "setActiveCampaign: Active Campaign ID is now '"+ id +"'");
}
catch (Exception e) {
pm.currentTransaction().rollback();
LOG.log(Level.WARNING, "setActiveCampaign: Exception: "+ e.getMessage());
} finally {
pm.close();
}
不幸的是,我收到“查询结果集不可修改”的异常。
我很确定它来自迭代的第一个查询,因为仅第二个查询就可以工作。
有什么想法需要更改才能使查询结果可修改吗?
最佳答案
我删除了 try/catch block 并得到了更详细的消息“java.lang.IllegalArgumentException:无法在单个事务中对多个实体组进行操作。”,这帮助我解决了我的问题。
我需要关闭事务:
pmfInstance.setNontransactionalRead(true);
pmfInstance.setNontransactionalWrite(true);
我不需要代码来确保事务安全。
在这里您可以找到更多信息: http://groups.google.com/group/google-appengine-java/browse_thread/thread/04f35b443c15d531
关于java - 异常:查询结果集不可修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3913583/