Удаление из набора в Google App Engine не сохраняется

StackOverflow https://stackoverflow.com/questions/1677952

  •  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() ...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top