我需要在Transaction
内进行查询,但是我不知道实体@Id,我所拥有的是字段的值,比如用户名而不是ID,
换句话说,我无法创建Key
来进行查询。如何进行查询以在Transaction
内获取实体?
答案 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实体的祖先。我认为这种方法可以节省大量的空间和数据管理问题。