NamespaceManager 和 Query by key 如何在 objectify 中协同工作

How NamespaceManager and Query by key works together in objectify

我的数据存储中有两个组织在它们自己的命名空间内。假设 organization1 存在于 namespace1 内部,organization2 存在于 namespace2 内部。我正在通过其网络安全密钥检索组织。假设组织 1 的网络安全密钥是 orgWebSafeKey1,组织 2 的网络安全密钥是 orgWebSafeKey2。我正在使用以下代码来获取组织:

NamespaceManager.set("namespace1");
Organisation organisation = (Organisation) ofy().load().key(Key.create(orgWebSafeKey1)).now();

上面的代码按我的预期工作,因为 organization1 存在于 namespace1 中,我正在尝试将该组织放入其命名空间中。

但是,如果我只是更改组织的 websafekey,那么根据我的预期,下面的查询结果应该是 "null" 组织,因为在 namespace1 中没有具有密钥 orgWebSafeKey2 的组织。但实际上它给了我组织2。

NamespaceManager.set("namespace1");
Organisation organisation = (Organisation) ofy().load().key(Key.create(orgWebSafeKey2)).now();

如果上面的查询结果是正确的,并且根据 objectify 和数据存储是预期的,那么我可以假设按键查询在所有命名空间中全局有效吗? 我还想确认在这种情况下 Key.create(orgWebSafeKey2) 不会更改密钥的名称空间?查询是 运行 根据键的命名空间而不是 NamespaceManager.set("namespace1")?

数据存储密钥包含以下组件:

  1. Project/App ID
  2. 命名空间
  3. 实体路径(祖先种类 + ID/Name(零个或多个),最终实体种类 + ID/Name)

由于命名空间是键的一部分,无论 NamespaceManager 设置的命名空间如何,通过键查找实体总能找到正确的实体。换句话说,Key 是一个 GUID,它在所有 apps/projects 中唯一标识一个实体。

参考下面link更多details/answers你的问题:

https://cloud.google.com/appengine/docs/java/multitenancy/multitenancy#Java_Using_namespaces_with_the_Datastore