google-app-engine - 事务内部只允许Ancestor查询,如何处理?

标签 google-app-engine objectify

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

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

最佳答案

在不深入研究更深层次的设计问题的情况下,实际上有两个选择:

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

Objectify(您用它标记了这篇文章)使得即使在事务内部也能轻松执行非事务查询。只需生成一个与事务无关的新 ofy 实例并使用它来运行查询……然后返回处理您的事务。请记住,这确实会中断事务并且可能会影响操作的完整性。通常这无关紧要。

如果您使用的是 Objectify4,您可以像这样运行操作:

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

2) 使用查找实体

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

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

每次您创建用户时,使用 XG 交易创建一个用户名,如果您允许更改用户名,则更新它。现在,要按用户名执行用户事务查找,首先查找用户名,然后使用它来查找用户。

关于google-app-engine - 事务内部只允许Ancestor查询,如何处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361008/

相关文章:

java - GAE JPA 2.0 Txn快速回滚

python - 来自源 'https://storage.googleapis.com' 的字体已被跨源资源共享策略阻止加载

java - ofy().consistency(Consistency.STRONG).load().type(this.getEntityClass()).count() 是否应该始终返回正确的结果?

java - Objectify 单元测试将数据持久保存到 Google Cloud Datastore

java - GAE - 部署到 Appspot 服务器后出现 ClassNotFoundException

google-app-engine - ndb 模型的 _post_put_hook 什么时候有不同于自己的 future ?

java - 无法在 Firebase 上初始化类 FirebaseThreadManagers 错误

java - 将 @index 添加到字段后,对象化过滤器不起作用

java - Objectify - 由祖先过滤的仅键查询的效率如何?

java - 对象化查询以返回属性值列表