0

我正在用谷歌应用引擎进行一些试验,并且缺少事务 di 框架。我正在尽我所能地实现它,但我一次又一次地遇到相同的异常:无法在单个事务中对多个实体组进行操作。找到了两个元素...我已经阅读了文档(http://code.google.com/appengine/docs/python/datastore/keysandentitygroups.html#Entity_Groups_Ancestors_and_Paths),但我似乎无法理解它们的含义。基本上我想要做的是:

我有一个对象列表。我想检查它们是否已经在数据库中。如果是,我将检查它们是否相等,如果不相等,则更新托管实例。否则我会坚持实体。在我的对象循环(尚未持久化的对象)中,我使用 EntityMananger.find() 通过 Id 查找实体。第二次出现错误。

我习惯于使用 spring/hibernate(JPA) 或 EJB3 环境,我以前从未见过这种情况。谁能给我一个简单的解释,为什么我不能在同一个交易中找到 2 个相同类型的实体?

不是在寻找如何,而是在寻找为什么......

4

2 回答 2

2

实体组是一个简单的概念。App Engine 中的实体有祖先。例如,您可以为书籍和作者建模。

Author: name->X 和 Author: name->Y 是 Author KIND 中的两个实体。Book 是另一种 KIND(KIND 只是实体的逻辑分组)。Books 和 Authors 之间的关系可以建模为父子关系。

例如

书:name->B1,B2 可能是作者:name->X 写的。因此,您将它们建模为:

作者:name->X 是两本书的父级:name->B1,B2。类似地,Book:name->B3 由 Author:name->Y 编写,因此可以将该关系建模为 Author:name->Y 是 Book:name->B3 的父级。

当您尝试在 Books kind 上进行交易时,您不能同时在 B1、B3 和 B3 上进行交易。因为他们参与不同的祖先 - 孩子关系。每个祖先子关系都是一个实体组。您一次只能“锁定”一个实体组。

希望这能让事情变得更清楚。

于 2010-08-03T21:36:48.787 回答
0

据我所知,GAE 数据存储会根据实体的层次结构自动对实体进行分组。例如,如果您有一个用户的概念,并且您让所有其他对象类型(电子邮件、联系人等)都将用户作为父关系,则 GAE 数据存储区会将所有这些内容视为同一组。如果与特定用户相关的数据似乎经常从特定位置获取,谷歌可以自动将他们的数据移动到更靠近该位置的农场,以优化数据检索速度。

困难在于,这意味着您必须将所有实体都绑定到一个主要的父实体,或者您必须避免跨绑定到不同父实体的对象进行事务。有时这没什么大不了的:将联系人从一个用户帐户转移到另一个用户帐户并不是您期望在 Gmail 中作为原子事务发生的那种事情。其他时候它可能是一个真正的拖累。

于 2010-08-03T21:34:47.293 回答