NamespaceManager和Query by key如何协同工作

时间:2016-11-14 06:01:27

标签: google-app-engine google-cloud-datastore objectify

我的数据存储区中有两个组织在他们自己的命名空间中。让我们说在namespace2中存在organisation1,在namespace2中存在organisation2。我正在通过其web-safe-key检索组织。让我们说organisation1的web-safe-key是orgWebSafeKey1,organisation2的web-safe-key是orgWebSafeKey2。我正在使用以下代码来组建一个组织:

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

上面的代码按照我的预期工作,因为organisation1存在于namespace1中,我正在尝试在其名称空间中获取该组织。

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

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

如果上述查询结果是正确的并且根据objectify和datastore预期,那么我可以假设按键查询在所有命名空间中全局工作吗? 我还要确认在这种情况下Key.create(orgWebSafeKey2)不会更改密钥的命名空间?并且查询是根据键的命名空间而不是NamespaceManager.set(“namespace1”)?

运行的

1 个答案:

答案 0 :(得分:0)

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

  1. 项目/应用程序ID
  2. 命名空间
  3. 实体路径(祖先种类+ ID /名称(零或更多),最终实体种类+ ID /名称)
  4. 由于命名空间是密钥的一部分,因此无论NamespaceManager设置的命名空间如何,按键查找实体始终会找到正确的实体。换句话说,Key是一个GUID,可以跨所有应用程序/项目唯一标识实体。

    有关您的问题的详细信息/答案,请参阅以下链接:

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