我需要在 a 中进行查询Transaction
,但是我不知道实体 @Id,我拥有的是一个字段的值,例如用户名而不是 ID,
所以换句话说,我不能创建一个Key
来做查询。如何进行查询以获取 Entity 中的一个Transaction
?
我需要在 a 中进行查询Transaction
,但是我不知道实体 @Id,我拥有的是一个字段的值,例如用户名而不是 ID,
所以换句话说,我不能创建一个Key
来做查询。如何进行查询以获取 Entity 中的一个Transaction
?
在不深入研究更深层次的设计问题的情况下,实际上有两种选择:
1) 在事务之外运行查询。
Objectify(你用它标记了这篇文章)使得即使在事务内部也可以轻松执行非事务查询。只需生成一个与事务无关的新实例并使用它来运行查询......然后返回到您的事务中工作。请记住,这确实会中断事务,并且可能会影响操作的完整性。很多时候没关系。
如果您使用的是 Objectify4,您可以像这样运行操作:
ofy.transactionless.load().type(Thing.class).filter("field", value)...etc
2)使用查找实体
在处理用户名之类的事情时,这通常是正确的答案。创建一个单独的实体,将用户名映射到您的 User 对象,如下所示:
class Username {
@Id String username;
Key<User> user;
}
每次创建用户时使用 XG 事务创建用户名,如果您允许更改用户名,则更新它。现在,要通过用户名执行用户的事务性查找,首先查找用户名,然后使用它来查找用户。
我遇到了类似的问题,我想出的最简单的方法是使用一个虚拟父实体。无需使用 XG 事务并为每个其他用户实体插入另一个用户名实体,只需创建一个虚拟父实体并将其设置为您从那里创建的每个用户实体的祖先。我认为这种方法节省了大量的空间和数据管理问题。