JDO для GAE: обновление объектов, возвращаемых запросом

Существует постоянный класс 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();
}

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

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

pm.makePersistentAll(versions);

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

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

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

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


person Kel    schedule 29.12.2010    source источник
comment
Возможно, посмотрев в журнале точку, в которой вы вызываете setOrder, вы поймете лучше.   -  person DataNucleus    schedule 29.12.2010
comment
Не могу вам помочь, но я могу выразить сочувствие, так как отладка таких вещей определенно заставила меня рвать волосы ...   -  person Peter Recore    schedule 29.12.2010


Ответы (1)


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

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

Собственно, между

tx.begin();

и

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

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

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

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

person Kel    schedule 29.12.2010
comment
Чтобы уточнить, вы говорите, что проблема была вызвана кодом, который не был показан в вашем фрагменте кода? - person Peter Recore; 31.12.2010
comment
да. Сразу после начала транзакции был вызов pm.getObjectById () для Project и вызов pm.makePersistent () для экземпляра Version перед фиксацией транзакции. - person Kel; 03.01.2011