2012-02-24 57 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(); 
} 

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