我正在尝试使用以下代码写入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();
}
不幸的是,我得到了“查询结果集不可修改”的例外情况。
我很确定它来自第一个带迭代的查询,因为第二个查询只能运行。
我需要更改哪些想法才能使查询结果可修改?
答案 0 :(得分:2)
我删除了try / catch块并获得了更详细的消息“java.lang.IllegalArgumentException:无法在单个事务中对多个实体组进行操作。”,这有助于我解决我的问题。
我需要关闭交易:
pmfInstance.setNontransactionalRead(true);
pmfInstance.setNontransactionalWrite(true);
我不需要代码是事务安全的。
在这里您可以找到更多信息: http://groups.google.com/group/google-appengine-java/browse_thread/thread/04f35b443c15d531
答案 1 :(得分:1)
什么是result.clear()?你无法清除这样的结果。 q.closeAll()更有意义。