【问题标题】:In Objectify, how do you load an entity by ID without knowing the parent key?在 Objectify 中,如何在不知道父键的情况下通过 ID 加载实体?
【发布时间】:2013-10-27 01:14:33
【问题描述】:

我在 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 怎么办?

【问题讨论】:

    标签: entity-framework google-app-engine objectify


    【解决方案1】:

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

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

    使用对象化:

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

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

    【讨论】:

    • "ids 只在同一个父母的兄弟姐妹之间是唯一的" 哇,我不知道!还有网络安全密钥,太棒了。非常感谢!
    • 所以您是说应该将 websafeKey 存储在子实体的属性中? (因此您不必通过在 API 方法中继续加载父实体来挖掘父 ID。)
    • 网络安全密钥只是密钥的字符串编码,因此将其存储在它所代表的实体中是没有意义的。这个问题是“如何在不知道父母 ID 的情况下加载孩子”,答案是“不可能”。您可以将孩子的 id 存储在索引属性中并查询它,但这可能是设计不足的创可贴。值得注意的是,您永远不必加载实体来创建或使用键 - 父实体实际上与键父实体不同。键只是坐标 - 不需要在层次结构中的每个坐标处都存在实体。
    • @Nick 感谢您的回复。我遇到的问题是在获取或插入具有祖父母的实体时,我需要 parentId 和 grandparentId 在我的 API 方法中这样做。我当时在想,让实体将其 websafeKey 存储为属性可能更方便。然后在我的移动应用程序中,当我想存储具有 gradparent 的 Entity 时,我可以只传递父级的 websafeKey,而不是传递 grandparentId 和 parentID 来生成实体的密钥。我的问题是 - 这会是糟糕的数据库设计还是有更好的方法来实现这个目标?
    • @Nick 我把它放到了一个新问题中:stackoverflow.com/questions/34860123/…
    【解决方案2】:

    您需要知道整个Key 才能get() 一个实体。子键由:种类、ID 父键组成。所以你需要提供所有三个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多