我在寫一個使用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();
}
當然,只要我發佈這個,我找到相關的帖子與答案。我會在這裏留下: http://stackoverflow.com/questions/7486710/updating-objects-in-gae – cjm 2012-02-24 01:07:53
顯然,這不是一個真正的答案。你檢索非事務性的對象,所以它們處於什麼狀態? (JDOHelper.getObjectState(obj)告訴你)。任何setter都會使這個領域變得骯髒(閱讀日誌,它告訴你)。然後你永遠不會開始一個新的txn,因此任何變化都不會進入數據庫(使用GAE v2插件,pm.close肯定會刷新所有剩下的更改)。 – DataNucleus 2012-02-24 08:30:55