Сохранение многих объектов в GAE с JPA - PullRequest
6 голосов
/ 23 ноября 2010

Я использую JPA с Google App Engine.Допустим, у меня есть очень простая @Entity, состоящая из ключа и строки, и ничего более.Теперь я создаю 10000 таких сущностей, помещаю их в список и хочу сохранить их все.

Если я попытаюсь использовать EntityManager em и цикл for, чтобы пройти через Список всех моих сущностей ...

for(MyEntity entity : listOfAllEntities) {
 em.persist(entity);
}

.. Я получу исключение IllegalArgumentException:

java.lang.IllegalArgumentException: не может работатьдля нескольких групп объектов в одной транзакции.

Насколько я понимаю, мне нужно закрыть и снова открыть EntityManager для каждого вызова persist ().Конечно, это очень много времени.Я пытаюсь запустить задачу один раз в день, которая перезагружает все сущности.Согласно политике GAE, время ожидания задачи составляет 30 секунд.

Таким образом, альтернативой является сохранение только 500 объектов одновременно и многократное выполнение задачи, которая, на мой взгляд, более сложна, чем должна быть.

Является ли это единственным способом достижения того, чтоЯ пытаюсь сделать или я что-то здесь упускаю?

Решение: Все ответы указывают в одном направлении.Я просто создал отношение «один ко многим», создав сущность «фиктивного родителя».Мне действительно не нужен родитель в моем случае, и это не имеет большого смысла в реальном мире, так сказать.Но после установки этого фиктивного объекта в качестве родительского для каждого из дочерних объектов я могу сохранить их точно так же, как и раньше, не слишком заботясь о транзакциях.Спасибо всем.

Ответы [ 2 ]

4 голосов
/ 23 ноября 2010

Возможно, это слишком упрощено, но вы можете просто добавить число X сущностей в качестве дочерних элементов родительской сущности, и это приведет к тому, что они окажутся в одной группе сущностей. Это позволит вам сохранить их все в одной транзакции. По сути, создайте собственные отношения «один ко многим» между родительским объектом и дочерними объектами, которые являются объектами, которые вы пытаетесь сохранить.

1 голос
/ 23 ноября 2010

Эта ошибка говорит о том, что вы используете транзакцию и пытаетесь работать с несколькими группами сущностей.

Из документов:

Все операции хранилища данных в транзакции должны работать с сущностями в одной и той жегруппа объектов.Это включает в себя запрос сущностей по предку, извлечение сущностей по ключу, обновление сущностей и удаление сущностей.Обратите внимание, что каждая корневая сущность принадлежит отдельной группе сущностей, поэтому одна транзакция не может создавать или работать более чем с одной корневой сущностью.

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

...