Группы объектов - PullRequest
       22

Группы объектов

0 голосов
/ 04 августа 2010

Я немного экспериментирую с движком приложений Google, и отсутствует инфраструктура транзакций.Я реализую его настолько хорошо, насколько могу, но я снова и снова сталкиваюсь с одним и тем же исключением: не могу работать с несколькими группами сущностей в одной транзакции.нашел оба элемента ... Я прочитал документацию (http://code.google.com/appengine/docs/python/datastore/keysandentitygroups.html#Entity_Groups_Ancestors_and_Paths), но я не могу понять, что они подразумевают. В основном я пытаюсь сделать следующее:

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

Я привык работать с пружиной/ hibernate (JPA) или среда EJB3, и я не видел этого раньше. Может ли кто-нибудь дать мне простое объяснение, почему я не могу найти 2 объекта одного типа в одной транзакции?

не ищет как, но почему ...

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

Группы сущностей - это простая концепция.У сущностей в App Engine есть предки.Например, вы можете смоделировать Книги и Авторы.

Author: name-> X и Author: name-> Y - две сущности в KIND Автор.Книга - это еще один ВИД (KIND - это просто логическая группа объектов).Отношения между Книгами и Авторами могут быть смоделированы как отношения предка и ребенка.

Например,

Книга: имя-> B1, B2 могла бы быть написана Author: name-> X.Таким образом, вы смоделировали их как:

Автор: имя-> Х является родителем обоих книг: имя-> В1, В2.Точно так же Book: name-> B3 написана Author: name-> Y и поэтому может смоделировать это отношение как Author: name-> Y является родителем Book: name-> B3.

Когда вы пытаетесь совершать сделки с типом Книги, вы не можете совершать сделки с B1, B3 и B3 вместе.Как они участвуют в разных отношениях предка и ребенка.Каждая дочерняя связь предка является группой сущностей.Вы можете одновременно «блокировать» только одну группу сущностей.

Надеюсь, это немного прояснит ситуацию.

0 голосов
/ 04 августа 2010

Насколько я помню, хранилище данных GAE автоматически группирует ваши сущности на основе их иерархии. Например, если у вас есть понятие «пользователь», и вы делаете все остальные типы объектов (электронные письма, контакты и т. Д.) «Пользователем» в качестве родительского отношения, хранилище данных GAE считает все эти элементы частью та же группа. Если кажется, что данные, относящиеся к конкретному пользователю, часто извлекаются из определенного местоположения, Google может автоматически переместить их данные в ферму ближе к этому местоположению, чтобы оптимизировать скорость извлечения данных.

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

...