Обновленные объекты JDO не будут сохраняться в GWT - PullRequest
0 голосов
/ 24 февраля 2012

Я пишу небольшое приложение, использующее GWT и JDO для хранения постоянных данных. Я пытался написать функцию, которая обновляет несколько объектов JDO на основе запроса. Его тело выглядит примерно так:

PersistenceManager pm = getPersistenceManager();
try {
    q = pm.newQuery(MyObject.class, query);
    List<MyObject> objects = (List<MyObject>) q.execute();
    for (MyObject object: objects) {
        object.setMyField(newValue);
    }
    System.out.println(objects); //[1]
} finally {
    pm.close();
}

Если посмотреть на вывод оператора print на [1], все объекты имеют правильно обновленные значения. Однако когда я выполняю RPC для получения обновленных объектов, значения остаются такими же, какими они были до вызова метода update. Если я проверяю хранилище данных в панели администратора, обновления также не отображаются.

Все остальные действия персистентности в моем приложении работают нормально (например, добавление новых объектов, удаление объектов, запрос объектов), но я не могу понять, что здесь не так. Большинство ресурсов, которые я обнаружил (например, http://code.google.com/appengine/docs/java/datastore/jdo/creatinggettinganddeletingdata.html#Updating_an_Object), предполагают, что простое открытие PersistenceManager должно сохранять любые изменения, которые вы вносите в извлеченные объекты.

Есть предложения? Я действительно сбит с толку.

Спасибо!

РЕШЕНИЕ

PersistenceManager pm = getPersistenceManager();
try {
    q = pm.newQuery(MyObject.class, query);
    List<MyObject> objects = (List<MyObject>) q.execute();
    for (MyObject object: objects) {
        object.setMyField(newValue);
        JDOHelper.makeDirty(object, myField);
    }
} finally {
    pm.close();
}

1 Ответ

1 голос
/ 25 февраля 2012

Правильный способ обновления JDO - использовать транзакцию, например, (без надлежащего обращения)

PersistenceManager pm = getPersistenceManager();
try {
    q = pm.newQuery(MyObject.class, query);
    List<MyObject> objects = (List<MyObject>) q.execute();
    pm.currentTransaction().begin(); // <-------
    for (MyObject object: objects) {
        object.setMyField(newValue);
    }
    pm.currentTransaction().commit(); // <-------
    System.out.println(objects); //[1]
} finally {
    pm.close();
}

Я бы порекомендовал вам сделать это для других сценариев обновления, включая операции добавления / удаления.

...