代码之家  ›  专栏  ›  技术社区  ›  Nick

使用JDO和GAE更新对象

  •  2
  • Nick  · 技术社区  · 16 年前

    所以,我用Wicket创建了一个小的网络应用,它将运行在谷歌应用引擎上。我使用的是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;
    

    我在代码之后执行查询,它在我更改值之前返回相同的对象。
    知道我做错了什么吗?

    1 回复  |  直到 16 年前
        1
  •  2
  •   Peter Recore    16 年前

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

    根据你想做什么,你有两个选择。

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

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

    下面是选项2的一些代码:

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