Как обновить логическое значение в хранилище данных GAE? - PullRequest
4 голосов
/ 28 августа 2010

У меня есть следующий код из учебника Андреаса Борглина :

@Override
public Model saveModel(Model model) {

    System.out.println("model isDone: " + ((Task)model).getDone());
    PersistenceManager pm = PMF.get().getPersistenceManager();
    Model savedModel = null;

    try {
        savedModel = pm.makePersistent(model);
    } catch (JDOException e) {
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        pm.close();
    }
    System.out.println("savedModel isDone: " + ((Task)savedModel).getDone());
    System.out.println("model isDone: " + ((Task)model).getDone());
    return savedModel;
}

Он отлично работает, когда я создаю тестовые объекты, но как только я хочу обновить их, логические значения нет изменить.Мой сохраненный «isDone» равен «true», и я хочу изменить его на «false».Вот что получается:

model isDone: false
savedModel isDone: true
model isDone: false

Изменение строк или установка дат работает без проблем.Поле определено как:

@Persistent
private boolean isDone = true;

Я также попытался:

@Persistent
private Boolean isDone;

В этом случае isDone всегда "false".

Ответы [ 2 ]

3 голосов
/ 18 октября 2010

Не уверен насчет конкретной проблемы, с которой вы столкнулись, но я рекомендую использовать объект Boolean вместо типа Boolean.То есть используйте:

@Persistent
private Boolean isDone;

Если вы добавите примитивное логическое поле после того, как вы уже создали несколько сущностей, в хранилище данных возникнут проблемы с созданием экземпляров более старых объектов, поскольку их значения для этого поля будут.С логическим значением они просто по умолчанию имеют значение «ноль», что вполне достаточно.

Кроме того, возможно, стоит рассмотреть возможность явно не определять истинное значение для вашего логического поля, что может быть причиной этой путаницы в хранилище данных.Вы должны изменить свое поле на что-то вроде «isNotDone».

0 голосов
/ 01 сентября 2010

Попробуйте использовать

@ Persistent

private Boolean isDone = Boolean.True;

Ранее я использовал Boolean, и он работал для меня.

...