1

Я столкнулся с «не может работать с несколькими группами объектов в одной транзакции». проблема при использовании APPENGINE FOR JAVA w/JDO со следующим кодом:Невозможно обернуть голову вокруг сохранения хранилища данных в Appengine

PersistenceManager pm = PMF.get(). getPersistenceManager();

Query q = pm.newQuery ("SELECT this FROM" + TypeA.class.getName() + "WHERE userId == userIdParam"); q.declareParameters ("String userIdParam"); Список poos = (Список) q.execute (userIdParam);

для (TypeA a: allTypeAs) { a.setSomeField (someValue); } pm.close(); }

Проблема заключается в том, что я не могу работать с несколькими объектами одновременно, в то время как b/c они arent в одной и той же группе сущностей во время транзакции. Несмотря на то, что не кажется, что я нахожусь в сделке, AppEngine генерирует один, потому что я следующий набор в моем jdoconfig.xml:

<property name="datanucleus.appengine.autoCreateDatastoreTxns" value="true"/> 

Fine. До сих пор, я думаю, я понимаю.

НО - если я заменю TypeA в приведенном выше коде, с TypeB - я не получу ошибку. Я не верю, что между типом a и типом b существует что-то другое: они имеют одну и ту же ключевую структуру. У них разные поля, но это не имеет значения, не так ли?

Мой вопрос: что может быть различным между TypeA и TypeB, что они дают это другое поведение? И, следовательно, что вы принципиально неправильно понимаете, что такое поведение может даже существовать ....

Спасибо.

+0

Использование autoCreateDatastoreTxns - это, вероятно, плохая идея, именно по той причине, что ваш пост контур. –

+0

Я думал, что это рекомендуемая настройка из документации appengine. – aloo

+0

«Конфигурация JDO мы рекомендуем использовать свойства с именем datanucleus.appengine.autoCreateDatastoreTxns для true. Это свойство, специфичное для App Engine, которое сообщает реализации JDO связывать транзакции хранилища данных с транзакциями JDO, которые управляются кодом приложения. строят новое приложение с нуля, это, вероятно, то, что вы хотите ». – aloo

ответ

5

Я не так много работал с App Engine, но из того, что я помню, группа сущностей определяется как иерархия объектов с корнем (деревом). Если ваши объекты TypeB имеют дочернее свойство, которое также является TypeB, возможно, что все они находятся в одной группе сущностей. Точно так же, если они все дети какого-то другого типа.

Если это не так, вам может потребоваться отделить список объектов, которые вы получаете от выбора, изменить каждый из них, а затем создать новую транзакцию для каждого из них, чтобы сохранить их по одному.
Взгляните на updating using detach (более длинный пример к концу подраздела).

+0

TypeB не имеет ссылок на какие-либо другие объекты в моем хранилище данных. Откуда вы знаете, находятся ли ваши объекты в одной группе лиц? Как вы это измените, если хотите? – aloo

+0

Итак, я сделал небольшую модификацию для своего кода. Я вызвал pm.detachCopyAll по результатам, возвращаемым моим запросом. Затем я повторил в результате список внесении изменений, и я, наконец, позвонил pm.MakePersistentAll (затем pm.close). Это работает! НО ПОЧЕМУ?!?!?!?!!?!? – aloo

+0

по работам Я имею в виду, что он позволяет мне одновременно обновлять несколько объектов TypeA, не выбрасывая исходную ошибку .... – aloo

Смежные вопросы