所以,我正在使用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;
我在此代码之后立即执行查询,并在更改值之前返回相同的对象 我有什么想法吗?
答案 0 :(得分:2)
默认情况下,JDO对象仅在创建它们的PersistenceManager打开时有效。 你说你已经在用户对象上调用了makePersistent()。这意味着您在上面的代码中显示的那个之前打开了另一个PersistenceManager。当您关闭PersistenceManager(可能是你关闭它)时,你的对象变得无效,(非正式地说)。
根据您的目的,您有两种选择。
您可以detach您的用户对象,这将允许它在其原始持久性管理器的上下文之外生活。
您可以使用刚刚创建的新PersistenceManager获取对象的全新副本
这是选项#2的一些代码:
trans.begin();
User user = (User) pm.getObjectById(User.class,"userkeyhere");
user.setLoginCount(user.getLoginCount()+1);
user.setLastLoginTime(new Date());
trans.commit();