在事务内只允许Ancestor查询,如何处理它?

时间:2012-07-06 11:05:04

标签: google-app-engine objectify

我需要在Transaction内进行查询,但是我不知道实体@Id,我所拥有的是字段的值,比如用户名而不是ID,

换句话说,我无法创建Key来进行查询。如何进行查询以在Transaction内获取实体?

2 个答案:

答案 0 :(得分:15)

如果不深入研究更深层次的设计问题,实际上有两个选择:

1)在事务之外运行查询。

Objectify(您使用此标记标记)使得即使在事务内部也可以轻松执行非事务性查询。只是生成一个与事务无关的新实例,并使用它来运行查询...然后返回到您的事务中工作。请记住,这确实会破坏事务,并可能影响操作的完整性。通常没关系。

如果你正在使用Objectify4,你可以像这样运行:

ofy.transactionless.load().type(Thing.class).filter("field", value)...etc

2)使用查找实体

在处理用户名之类的事情时,这通常是正确的答案。创建一个单独的实体,将用户名映射到User对象,如下所示:

class Username {
    @Id String username;
    Key<User> user;
}

每次创建用户时都使用XG事务创建用户名,如果允许更改用户名,则更新用户名。现在,要通过用户名执行用户的事务性查找,首先查找用户名,然后使用它来查找用户。

答案 1 :(得分:0)

我遇到了类似的问题,我提出的最简单的方法是使用一个虚拟父实体。而不是使用XG事务并为每个其他User实体插入另一个Username实体,只需创建一个虚拟父实体并将其设置为您从那里创建的每个User实体的祖先。我认为这种方法可以节省大量的空间和数据管理问题。