在Objectify中,如何在不知道父密钥的情况下通过ID加载实体?

Mar*_* M. 4 google-app-engine entity-framework objectify

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

ofy().load.type(SomeChildClass.class).id(idOfSomeChildClassInstace);
Run Code Online (Sandbox Code Playgroud)

这没有发现什么.似乎您需要知道SomeChildClass的父级才能从datestore获取它.我知道这是有效的.

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

如果我想在不知道父级的情况下加载SomeChildClass的实例,只需具有SomeChildClass的id即可.

小智 16

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

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

使用客观化:

String websafeKey = Key.create(parentKey, Entity.class, id).getString();
Key<Entity> key = Key.create(websafeKey);
Run Code Online (Sandbox Code Playgroud)

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