1

我在Problems while save a pre-persisted object in Google App Engine (Java)中看到了一个类似的问题,实际上我没有在我的持久性管理器上调用 close() 。但是,我现在打电话关闭,但我的对象更新没有被持久化。具体来说,我想从集合中删除一个元素,并保存那个较小的集合。这是与持久性管理器相关的代码,它不会引发异常,但不会保存我的数据:

    UserService userService = UserServiceFactory.getUserService();
    User user = userService.getCurrentUser();

    PersistenceManager pm = PMF.get().getPersistenceManager();
    UserProfileInfo userProfile = pm.getObjectById(UserProfileInfo.class,user.getUserId());
    int presize = userProfile.getAccounts().size();
    AccountInfo ai = userProfile.removeAccount(id);
    int postsize = userProfile.getAccounts().size();
    UserProfileInfo committed = (UserProfileInfo)pm.makePersistent(userProfile);
    int postcommitsize = committed.getAccounts().size();
    pm.close();

这是 UserProfileInfo 类的相关部分:

@PersistenceCapable(identityType = IdentityType.APPLICATION)
class UserProfileInfo {
  @Persistent
  private Set<AccountInfo> accounts;

public AccountInfo removeAccount(Long id) throws Exception {
    Iterator<AccountInfo> it = accounts.iterator();
    StringBuilder sb = new StringBuilder();
    while(it.hasNext()) {
        AccountInfo acctInfo = it.next();
        Long acctInfoId = acctInfo.getId();
        if(acctInfoId.equals(id)) {
            it.remove();
            return acctInfo;
        }
        sb.append(" ");
        sb.append(acctInfoId);
    }
    throw new Exception("Cannot find id " + id + " Tried " + sb.toString());
  }
}
4

2 回答 2

1

所以看起来答案是拥有的对象不能使用 Long 主键。对于我添加的另一种对象类型,数据核增强器告诉我这一点。我不确定为什么它为我的 AccountInfo 对象跳过了这个警告。

我将密钥切换为字符串,并更改了注释以正确使用字符串,现在我可以从集合中删除。

于 2009-11-11T03:43:26.233 回答
0

我原以为调试任何东西时要做的第一件事就是查看日志(调试级别)。它告诉您对象在不同点的状态。那么当你调用 makePersistent() 时它处于什么状态?之后 ?以及调用 pm.close() 时会发生什么...

于 2009-11-05T10:52:35.793 回答