2

因此,我正在使用 Wicket 创建一个小型 Web 应用程序,该应用程序将在 google 应用程序引擎上运行。我正在使用 JDO,到目前为止,持久化数据(插入)或查询相同数据对象的数据都没有问题。也许我遗漏了一些基本的东西,我正在尝试获取其中一个持久对象,更改两个值,然后我希望在数据存储中更新修改后的对象。

我有一个持久的用户对象。我可以查询这个,所以我知道对象本身有正确的注释。

我正在运行以更新它的代码是:

final PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction trans = pm.currentTransaction();
try{ 
  trans.begin();
  user.setLoginCount(user.getLoginCount()+1);
  user.setLastLoginTime(new Date());
  trans.commit();
}finally{
  if (trans.isActive()) {
    trans.rollback();
    System.out.println("----transaction rollback - submitLogin----");
  }
  pm.close();
}

这是我想要更改的这两件事的用户对象注释......

@Persistent
private Date lastLoginTime;

@Persistent
private int loginCount = 0;

我在此代码之后立即进行查询,它在我更改值之前返回相同的对象。
任何想法我做错了什么?

4

1 回答 1

2

默认情况下,JDO 对象仅在创建它们的 PersistenceManager 打开时才有效。你说你已经在用户对象上调用了 makePersistent() 。这意味着您在上面的代码中向我们展示的那个之前打开了另一个 PersistenceManager。当您关闭该 PersistenceManager (大概是您关闭它)时,您的对象变得无效(非正式地说。)

根据您想做什么,您有两种选择。

  1. 您可以分离您的用户对象,这将允许它在其原始持久性管理器的上下文之外拥有生命。

  2. 您可以使用刚刚创建的新 PersistenceManager 获取对象的新副本

这是选项#2的一些代码:

trans.begin();
User user = (User) pm.getObjectById(User.class,"userkeyhere");
user.setLoginCount(user.getLoginCount()+1);
user.setLastLoginTime(new Date());
trans.commit();
于 2009-09-08T22:26:43.157 回答