4

我在 objectify 中有一个实体组,典型的 SomeParentClass 和 SomeChildClass。我想做这样的事情来从数据存储中加载 SomeChildClass 的实例。

ofy().load.type(SomeChildClass.class).id(idOfSomeChildClassInstace);

这是返回没有找到。似乎您需要知道 SomeChildClass 的父级才能从日期存储中获取它。我知道这是有效的。

Key<SomeChildClass> k = Key.create(someParentClass.generateKey(), SomeChildClass.class, idOfSomeChildClassInstace);
ofy().load().key(k).now;

如果我想在不知道父级的情况下加载 SomeChildClass 的实例,只需拥有 SomeChildClass 的 id 怎么办?

4

2 回答 2

16

你不能这样做 - 实体的实际完整标识符是其每个祖先的种类和 id 以及它自己的种类和 id。这就是为什么构建完整密钥有效,但仅使用子实体 ID 无效。另一种看待它的方式是,id 仅在同一父级的兄弟姐妹之间是唯一的。

解决您的问题的最简单方法是为您的子实体生成一个密钥,然后为其获取“网络安全字符串”。此字符串包含实体及其所有父级的所有信息,可用于完全重构完整的 id。

使用对象化:

String websafeKey = Key.create(parentKey, Entity.class, id).getString();
Key<Entity> key = Key.create(websafeKey);

如果需要,您也可以使用低级 api 执行此操作。

于 2013-10-18T10:44:28.183 回答
2

您需要了解整体Key才能成为get()实体。子密钥包括:种类、ID父密钥。所以你需要提供所有三个。

于 2013-10-18T10:28:25.540 回答