【问题标题】:updating an object with JDO and GAE使用 JDO 和 GAE 更新对象
【发布时间】:2009-09-08 16:27:50
【问题描述】:

所以,我正在使用 Wicket 创建一个小型网络应用程序,该应用程序将在 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;

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

【问题讨论】:

    标签: java google-app-engine jdo


    【解决方案1】:

    默认情况下,JDO 对象仅在创建它们的 PersistenceManager 打开时才有效。 你说你已经在用户对象上调用了 makePersistent() 。这意味着您在上面的代码中向我们展示的那个之前打开了另一个 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();
    

    【讨论】:

    • 谢谢,这正是我想要的。我正在调用 pm.makePersistant() 将对象添加到数据存储区,然后调用 pm.close() 并在应用程序中使用我的对象。然后我正在创建一个新的 pm 并尝试使用它来更新对象。现在,我只是再次获取对象并复制字段。似乎工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 2020-05-18
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多