2009-09-08 59 views
2

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

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

我正在更新它的代码是:

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; 

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

回答

2

默认情况下,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(); 
+0

感谢,这正是我正在寻找。我打电话pm.makePersistant()将对象添加到数据存储,然后pm.close()并在应用程序中使用我的对象。然后我创建了一个新的pm,并尝试使用它来更新对象。现在,我只需再次获取对象并复制字段。似乎工作。 – Nick 2009-09-09 12:51:52