【问题标题】:Exception: Query result sets are not modifiable例外:查询结果集不可修改
【发布时间】:2010-10-12 19:50:50
【问题描述】:

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

不幸的是,我收到“查询结果集不可修改”异常。

我很确定它来自带有迭代的第一个查询,因为单独的第二个查询就可以工作。

任何想法我需要更改以使查询结果可修改?

【问题讨论】:

  • 为什么不直接发布堆栈跟踪?这会告诉你异常来自哪里。
  • 这不是全部信息:“com.example.myproject.idea.server.AdminServiceImpl setActiveCampaign: setActiveCampaign: Exception: Query result sets are not modifiable” 我猜它没有更多细节,因为我自己处理错误。
  • 我没有询问错误信息,我说的是“堆栈跟踪”。所有异常都有堆栈跟踪。 “e.printStackTrace”也许。
  • 谢谢,我删除了 try/catch 块并获得了 StackTrace。然后更详细的消息是“jjava.lang.IllegalArgumentException:不能在单个事务中对多个实体组进行操作。”,这帮助我解决了我的问题

标签: java exception jdo


【解决方案1】:

我删除了 try/catch 块并收到了更详细的消息“java.lang.IllegalArgumentException: can't operation 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】:

    什么是 result.clear() ?你不能清除这样的结果。 q.closeAll() 更有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-31
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      相关资源
      最近更新 更多