Что происходит (на основе сообщения об ошибке), что вы пытаетесь сохранить в транзакции Index
, который содержит Blobx
, которые содержат Userx
, которые находятся в разных группах сущностей, в транзакции , Когда вы звоните em.persist(index)
, он будет каскадно сохранять все сущности внутри него, и все те, кто внутри них.
Думайте о группе сущностей как о кластере машин. Некоторые из ваших Index
находятся в кластере А в штате Невада. Blobx
, содержащиеся в них, находятся в кластере B, в штате Мэн, а Userx
, содержащиеся в них, находятся в кластерах B и C, в Техасе и Орегоне. То, как они все оказались там, совершенно случайно, и (с вашим кодом, как он есть) полностью вне вашего контроля. Просить App Engine сохранить все эти географически несопоставимые объекты и узнать, когда происходит сбой (т. Е. В транзакции), практически невозможно, и потребовалось бы множество сетевых перекрестных разговоров, чтобы все стороны знали, что все другие стороны в порядке. Так что это не разрешено.
Что вы хотите сделать, так это убедиться, что Google объединяет все ваши объекты в одну группу объектов, что означает, что все они находятся в одном (географическом) месте. Для этого прочитайте документы по транзакциям , в которых описано, как убедиться, что ваши сущности окажутся в одной и той же группе сущностей, а это значит, что они смогут обработать транзакцию для всех них.
Теперь, у группирующих сущность вещей есть свои недостатки. А именно медлительность и неравномерное использование хранилища данных (например, теперь, когда все ваши сущности будут в Техасе, пользователи в Орегоне увидят ненужную медлительность!), Поэтому используйте группы сущностей только в том случае, если вам абсолютно необходимо использовать транзакции для всех сущностей. Например, не используйте каскадное сохранение, если только вам это не нужно, или не делайте это в транзакции, если вам не нужно.