Удаление из набора в Google App Engine не сохраняется
-
16-09-2019 - |
Вопрос
Я вижу аналогичный вопрос в Проблемы при сохранении предварительно сохраненного объекта в Google App Engine (Java), и действительно, я не вызывал close() в моем менеджере сохраняемости.Однако сейчас я вызываю 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());
}
}
Решение
Таким образом, похоже, что ответ заключается в том, что принадлежащие объекты не могут использовать длинный первичный ключ.Усилитель datanucleus сообщил мне это для другого типа объекта, который я добавил.Я не уверен, почему он пропустил это предупреждение для моего объекта AccountInfo.
Я переключил свой ключ на строку и изменил аннотации, чтобы правильно использовать строку, и теперь я могу удалить ее из коллекции.
Другие советы
Я бы подумал, что первое, что нужно сделать при отладке чего-либо, это посмотреть журнал (уровень отладки).Он сообщает вам, в каких состояниях находятся объекты в разных точках.Итак, в каком состоянии он находится, когда вы вызываете makePersistent() ?а после ?и что происходит, когда вы вызываете pm.close() ...