2010-10-12 62 views
1

我想寫使用此代碼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

爲什麼不張貼堆棧跟蹤?這會告訴你異常來自哪裏。 – DataNucleus 2010-10-12 10:24:34

+0

這不是整個消息:「com.example.myproject.idea.server.AdminServiceImpl setActiveCampaign:setActiveCampaign:Exception:查詢結果集不可修改」我想它沒有更多的細節,因爲我正在處理錯誤myselfe 。 – JochenJung 2010-10-12 10:37:00

+1

我沒有要求錯誤信息,我說「堆棧跟蹤」。所有例外都有一個堆棧跟蹤。也許是「e.printStackTrace」。 – DataNucleus 2010-10-12 10:39:05

回答

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

result.clear()是什麼?你不能清除那樣的結果。 q.closeAll()更有意義。

+0

您是對的。我不需要他們兩個並將其刪除。 – JochenJung 2010-10-12 11:47:35