我在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());
}
}
答案 0 :(得分:1)
所以看起来答案是拥有的对象不能使用Long主键。 datanucleus enhancer告诉我这个我添加的另一个对象类型。我不确定为什么它会为我的AccountInfo对象跳过此警告。
我将我的密钥切换为String,并更改了注释以正确使用字符串,现在我可以从集合中删除。
答案 1 :(得分:0)
我认为在调试任何东西时要做的第一件事就是查看日志(DEBUG级别)。它告诉您对象在不同点处的状态。那么当你调用makePersistent()时它处于什么状态?之后 ?当你调用pm.close()...
时会发生什么