我正在使用GWT和JDO编写一个小应用程序来存储持久数据。我一直在尝试编写一个基于查询更新多个JDO对象的函数。它的身体看起来像这样:
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();
}
如果我在[1]处查看print语句的输出,则所有对象都具有正确更新的值。但是,当我创建RPC以检索更新的对象时,这些值与调用更新方法之前的值相同。如果我在管理面板中检查数据存储区,则不会显示更新。
我的应用程序中的所有其他持久性行为都可以正常工作(例如添加新对象,删除对象,查询对象),但我似乎无法弄清楚这里有什么问题。我发现的大多数资源(如http://code.google.com/appengine/docs/java/datastore/jdo/creatinggettinganddeletingdata.html#Updating_an_Object)都表明只要打开PersistenceManager就应该保留对检索到的对象所做的任何更改。
有什么建议吗?我真的很困惑。
谢谢!
解
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 :(得分:1)
更新JDO的正确方法是使用交易,例如(没有适当的处理)
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();
}
我建议您为其他所有其他更新方案执行此操作,包括添加/删除操作。