代码之家  ›  专栏  ›  技术社区  ›  JochenJung

异常:查询结果集不可修改

  •  1
  • JochenJung  · 技术社区  · 14 年前

    我正在尝试使用以下代码写入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 回复  |  直到 14 年前
        1
  •  2
  •   JochenJung    14 年前

    我删除了try/catch块,得到了更详细的消息“java.lang.illegalargumentexception:can't operate on multiple entity groups in a single transaction.”,这帮助我解决了我的问题。

    我需要关闭事务:

    pmfInstance.setNontransactionalRead(true);
    pmfInstance.setNontransactionalWrite(true);
    

    我不需要代码来保证交易安全。

    您可以在这里找到更多信息: http://groups.google.com/group/google-appengine-java/browse_thread/thread/04f35b443c15d531

        2
  •  1
  •   DataNucleus    14 年前

    result.clear()是什么?你不能把结果弄清楚。 q.closeAll()更有意义。