Исключение: наборы результатов запроса нельзя изменить.

Я пытаюсь написать в магазин 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();
    }

К сожалению, я получаю исключение «Наборы результатов запроса не поддаются изменению».

Я совершенно уверен, что это исходит из первого запроса с итерацией, потому что только второй будет работать.

Любые идеи, что мне нужно изменить, чтобы сделать результат запроса модифицируемым?


person JochenJung    schedule 12.10.2010    source источник
comment
Почему бы просто не опубликовать трассировку стека? и это скажет вам, откуда исходит исключение.   -  person DataNucleus    schedule 12.10.2010
comment
Это еще не все сообщение: com.example.myproject.idea.server.AdminServiceImpl setActiveCampaign: setActiveCampaign: Exception: наборы результатов запроса не поддаются изменению. Я думаю, в нем нет более подробной информации, потому что я сам обрабатываю ошибку.   -  person JochenJung    schedule 12.10.2010
comment
Я не просил сообщение об ошибке, я сказал трассировку стека. Все исключения имеют трассировку стека. e.printStackTrace возможно.   -  person DataNucleus    schedule 12.10.2010
comment
Спасибо, я удалил блок try/catch и получил StackTrace. Тогда более подробное сообщение было jjava.lang.IllegalArgumentException: не может работать с несколькими группами сущностей в одной транзакции, что помогло мне решить мою проблему.   -  person JochenJung    schedule 12.10.2010


Ответы (2)


Я удалил блок try/catch и получил более подробное сообщение «java.lang.IllegalArgumentException: невозможно работать с несколькими группами сущностей в одной транзакции», что помогло мне решить мою проблему.

Мне нужно было отключить транзакции:

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

Мне не нужен код для обеспечения безопасности транзакций.

Дополнительную информацию можно найти здесь: http://groups.google.com/group/google-appengine-java/browse_thread/thread/04f35b443c15d531

person JochenJung    schedule 12.10.2010

Что такое result.clear()? Вы не можете очистить результаты таким образом. q.closeAll() имеет больше смысла.

person DataNucleus    schedule 12.10.2010