从Google App Engine中的Set中删除不会被保留

时间:2009-11-05 02:25:09

标签: java google-app-engine jdo

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

    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());
  }
}

2 个答案:

答案 0 :(得分:1)

所以看起来答案是拥有的对象不能使用Long主键。 datanucleus enhancer告诉我这个我添加的另一个对象类型。我不确定为什么它会为我的AccountInfo对象跳过此警告。

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

答案 1 :(得分:0)

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

时会发生什么