2012-02-24 55 views
0

我在寫一個使用GWT和JDO存儲持久數據的小應用程序。我一直在嘗試編寫一個基於查詢更新多個JDO對象的函數。它的機身看起來是這樣的:已更新的JDO對象不會在GWT中持久

PersistenceManager pm = getPersistenceManager(); 
try { 
    q = pm.newQuery(MyObject.class, query); 
    List<MyObject> objects = (List<MyObject>) q.execute(); 
    for (MyObject object: objects) { 
     object.setMyField(newValue); 
    } 
    System.out.println(objects); //[1] 
} finally { 
    pm.close(); 
} 

如果我看的print語句在輸出[1],對象都具有正確更新值。但是,當我使用RPC來檢索更新的對象時,值與調用update方法之前的值相同。如果我在管理面板中檢查數據存儲,則更新也不會顯示。

我的應用程序中的所有其他持久性行爲都可以正常工作(例如,添加新對象,刪除對象,查詢對象),但我似乎無法弄清楚這裏有什麼問題。我發現的大多數資源(如http://code.google.com/appengine/docs/java/datastore/jdo/creatinggettinganddeletingdata.html#Updating_an_Object)都表明只要打開PersistenceManager,就應該保留對檢索對象所做的任何更改。

有什麼建議嗎?我真的很困惑。

謝謝!

SOLUTION

PersistenceManager pm = getPersistenceManager(); 
try { 
    q = pm.newQuery(MyObject.class, query); 
    List<MyObject> objects = (List<MyObject>) q.execute(); 
    for (MyObject object: objects) { 
     object.setMyField(newValue); 
     JDOHelper.makeDirty(object, myField); 
    } 
} finally { 
    pm.close(); 
} 
+0

當然,只要我發佈這個,我找到相關的帖子與答案。我會在這裏留下: http://stackoverflow.com/questions/7486710/updating-objects-in-gae – cjm 2012-02-24 01:07:53

+0

顯然,這不是一個真正的答案。你檢索非事務性的對象,所以它們處於什麼狀態? (JDOHelper.getObjectState(obj)告訴你)。任何setter都會使這個領域變得骯髒(閱讀日誌,它告訴你)。然後你永遠不會開始一個新的txn,因此任何變化都不會進入數據庫(使用GAE v2插件,pm.close肯定會刷新所有剩下的更改)。 – DataNucleus 2012-02-24 08:30:55

回答

1

更新JDOs是使用一個交易,例如正確的方法(W/O妥善處理)

PersistenceManager pm = getPersistenceManager(); 
try { 
    q = pm.newQuery(MyObject.class, query); 
    List<MyObject> objects = (List<MyObject>) q.execute(); 
    pm.currentTransaction().begin(); // <------- 
    for (MyObject object: objects) { 
     object.setMyField(newValue); 
    } 
    pm.currentTransaction().commit(); // <------- 
    System.out.println(objects); //[1] 
} finally { 
    pm.close(); 
} 

我建議你做其他所有其他更新方案,包括添加/刪除操作。