使用JDO和GAE更新对象

时间:2009-09-08 16:27:51

标签: java google-app-engine jdo

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

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

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

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;

我在此代码之后立即执行查询,并在更改值之前返回相同的对象 我有什么想法吗?

1 个答案:

答案 0 :(得分:2)

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

根据您的目的,您有两种选择。

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

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

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

    trans.begin();
    User user = (User) pm.getObjectById(User.class,"userkeyhere");
    user.setLoginCount(user.getLoginCount()+1);
    user.setLastLoginTime(new Date());
    trans.commit();