1

我对刚刚检索到的对象列表的 JDO 持久性有点问题。

我想做的是:

  • 获取“订单”列表
  • 修改一个属性“状态”
  • 批量更新“订单”

到目前为止,我得到的是"Object with id ... is managed by a different Object Manager"。但是等等,没有 Spring,我还没有遇到过这样的问题!

我试图像这样调试它:

List<Orderr> orders = orderDao.findByIdAll(ordersKeys);
for(Orderr o : orders) {
    System.out.println(JDOHelper.getPersistenceManager(o).hashCode());
    //hashcode is 1524670
    o.setSomething(somevalue);
}
orderDao.makePresistentAll(orders); //hashcode inside is 31778523

makePersistentAll 除了:

try {
    System.out.println(getPersistenceManager().hashCode());
    getPersistenceManager().makePersistentAll(entities);
} finally {
    getPersistenceManager().close();
}

我所有的 DAO 都扩展了 JdoDaoSupport。pmf 由 spring 注入和管理。

最后,问题来了:为什么在findByIdAll之后持久化管理器关闭了?或者我为什么要获得新的持久性管理器实例?当然,我的 findByIdAll 方法不会在持久性管理器上调用 close。

当然,如果我为每个“订单”调用 makePersistent 效果很好。但它打破了业务和数据库逻辑的分层......

UPD 刚刚发现,在迁移到 spring 管理的 PersistenceManager 后,所有对 makePersistentAll 的调用都不起作用。在春天之前,我使用了普通的旧 PMF.get() 助手,一切都很闪亮!

4

2 回答 2

1

如果您的应用程序响应 HTTP 请求的时间超过 30 秒,它将被终止。GAE 的部分操作模式是您的应用程序不是长期存在的。完全没有。

尽管您不会在自己的站点上执行此操作,但您必须习惯于仅对 DB 会话管理器进行短期访问。有时需要很长时间才能为每笔交易重新打开它,但这就是 GAE 使流程可扩展的方式。如果你真的有很多流量,它可以在多台服务器上并行运行你的应用程序。

于 2010-01-02T20:53:22.563 回答
0

这是一种魔法。每次我在这里提出问题时,我都会在发布后 24 小时内知道我的问题的答案。

当然,工厂按其含义应该总是创建一个新的 pm 实例。现在我保存了对旧 pm 的引用(就像我在 spring jdo daos 之前所做的那样)并且一切都很好。

于 2010-01-03T09:58:47.807 回答