例外:查询结果集不可修改

时间:2010-10-12 10:17:42

标签: java exception jdo

我正在尝试使用以下代码写入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();
    }

不幸的是,我得到了“查询结果集不可修改”的例外情况。

我很确定它来自第一个带迭代的查询,因为第二个查询只能运行。

我需要更改哪些想法才能使查询结果可修改?

2 个答案:

答案 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()更有意义。