JDO для GAE: обновление объектов, возвращаемых запросом - PullRequest
0 голосов
/ 29 декабря 2010

Существует постоянный класс Project, каждый экземпляр которого имеет список объектов типа Version (принадлежащее отношение «один ко многим» между классами Project и Version).

Я получаю несколько объектов Version из хранилища данных с запросом, меняю их и пытаюсь сохранить:

PersistenceManager pm = PMF.get().getPersistenceManager();
Transaction tx = pm.currentTransaction();
try {
    tx.begin();
    Query q = pm.newQuery(Version.class, "... filters here ...");
    q.declareParameters(" ... parameters here ...");
    List<Version> versions = (List<Version>)q.execute(... parameters here ...);
    if (versions.size() > 0) {
        for (Version version : versions) {
            version.setOrder(... value here ...);
        }
        pm.makePersistentAll(versions);
    }
    tx.commit();
    return newVersion.toVersionInfo();
} finally {
    pm.close();
}

Все выполняется без ошибок, запрос фактически возвращает несколько объектов, свойства правильно заданы в списке версий времени выполнения, но свойства объектов не обновляются в хранилище данных.

Вообще, насколько я понимаю, версии нужно сохранять даже без вызова

pm.makePersistentAll(versions);

, поскольку свойства объекта установлены до pm.close (), но ничего не сохраняется, если эта строка также опущена.

В то же время, если я получу экземпляр типа Project (которому принадлежит множество экземпляров типа Version) с помощью метода pm.getObjectById (), и пройдусь по всем связанным объектам Version в цикле, все изменения будут сохранены правильно (без вызов метода pm.makePersistent ()).

Вопрос в том, что не так с таким способом обновления объектов? Почему свойства объекта Version не обновляются в хранилище данных?

Я не смог найти ничего полезного ни в JDO, ни в документации GAE.

1 Ответ

0 голосов
/ 29 декабря 2010

Спасибо за совет по поводу логов от DataNucleus и сочувствие от Питера Recore:)

Честно говоря, я пропустил несколько важных моментов в своем вопросе.

На самом деле, между

tx.begin();

и

Query q = pm.newQuery(Version.class, "... filters here ...");

Я получаю экземпляр Project, и после цикла обновления экземпляров Version я сохраняю еще один объект Version.

Итак, я фактически дважды получал список версий, и в соответствии с порядком фиксации в журналах экземпляр Project также сохранялся дважды. Вторая операция сохранения перезаписывает первую.

Я изменил порядок операций и получил ожидаемое поведение.

...