JDO for GAE:更新查询返回的对象

时间:2010-12-29 13:30:44

标签: google-app-engine google-cloud-datastore jdo

有可持续的类Project,其每个实例都有Version类型的对象列表(Project和Version类之间拥有一对多的关系)。

我从带有查询的数据存储区中获取了多个Version对象,更改它们并尝试保存:

PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
    tx.begin();
    Query q = pm.newQuery(Version.class, "... filters here ...");
    q.declareParameters(" ... parameters here ...");
    List<Version> versions = (List<Version>)q.execute(... parameters here ...);
    if (versions.size() > 0) {
        for (Version version : versions) {
            version.setOrder(... value here ...);
        }
        pm.makePersistentAll(versions);
    }
    tx.commit();
    return newVersion.toVersionInfo();
} finally {
    pm.close();
}

一切都没有错误地执行,查询实际上返回了几个对象,在运行时版本列表中正确设置了属性,但是在数据存储区中没有更新对象属性。

一般来说,据我所知,即使不打电话

也应保存版本
pm.makePersistentAll(versions);

,因为对象属性是在pm.close()之前设置的,但是没有保存,如果省略了这一行。

同时,如果我使用pm.getObjectById()方法检索Project类型的实例(它拥有许多类型为Version的实例),并遍历循环中所有相关的Version对象,则所有更改都会正确保存(不带调用pm.makePersistent()方法)。

问题是,这种更新对象的方式有什么问题?为什么版本对象属性未在数据存储区中更新?

我在JDO和GAE文档中都找不到任何有用的东西。

1 个答案:

答案 0 :(得分:0)

感谢有关DataNucleus的日志和Peter Recore的同情的建议:)

坦率地说,在我的问题中,我错过了一些重要的观点。

实际上,间

tx.begin();

Query q = pm.newQuery(Version.class, "... filters here ...");

我正在检索Project实例,并且在Version实例更新循环之后,我再坚持使用一个Version对象。

所以,我实际上检索了一些版本列表两次,并且根据日志中的提交顺序,Project实例也被保存了两次。第二个保存操作覆盖了第一个。

我改变了操作的顺序,并获得了预期的行为。