【发布时间】:2010-12-29 13:30:43
【问题描述】:
有一个持久化类 Project,它的每个实例都有一个 Version 类型的对象列表(在 Project 和 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 文档中都找不到任何有用的东西。
【问题讨论】:
-
也许在你调用 setOrder 的地方查看日志你可能会更好地理解。
-
帮不了你,但我可以表示同情,因为调试这些类型的东西肯定让我想撕毁我的头发......
标签: google-app-engine google-cloud-datastore jdo