Не могу обернуть голову вокруг постоянства хранилища данных appengine - PullRequest
1 голос
/ 07 июня 2010

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

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

Запрос q = pm.newQuery («ВЫБРАТЬ это ИЗ» + TypeA.class.getName () + "ГДЕ userId == userIdParam"); q.declareParameters ("String userIdParam"); List poos = (List) q.execute (userIdParam);

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

Кажется, проблема в том, что я не могу работать с несколькими объектами одновременно, поскольку они не находятся в одной группе объектов во время транзакции. Несмотря на то, что это не похоже на то, что я нахожусь в транзакции, appengine генерирует ее, потому что у меня есть следующий набор в моем jdoconfig.xml:

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

Fine. Пока я думаю, что понимаю.

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

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

Спасибо.

1 Ответ

5 голосов
/ 07 июня 2010

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

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

...