【问题标题】:JDO for GAE: Update objects returned by a queryJDO for GAE:更新查询返回的对象
【发布时间】: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


【解决方案1】:

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

坦率地说,我在我的问题中遗漏了几个要点。

其实之间

tx.begin();

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

我正在检索 Project 实例,并且在 Version 实例更新循环之后,我正在保留另一个 Version 对象。

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

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

【讨论】:

  • 澄清一下,您是说问题是由您的代码 sn-p 中未显示的代码引起的吗?
  • 是的。在事务开始后对 Project 进行了 pm.getObjectById() 调用,在事务提交之前对 Version 实例进行了 pm.makePersistent() 调用。
猜你喜欢
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2010-10-20
  • 2014-10-12
  • 2016-03-14
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多