【问题标题】:Entity hierarchies in Objectify 4.0Objectify 4.0 中的实体层次结构
【发布时间】:2013-10-06 14:59:31
【问题描述】:

有没有办法定义一个实体层次结构,只允许查询特定的子类?考虑下面的情况。让我们有一个抽象的基类,它定义了公共属性和具体的子类 A 和 B。

class abstract Base {
...
}

class A extends Base {
...
}

class B extends Base {
...
}

我想运行如下示例查询。

  • 检索所有类型 A 和 B 的实体

     Base base = this.objectify.load().type(Base.class).list();
    
  • 检索所有类型 A 的实体

     Base base = this.objectify.load().type(A.class).list();
    
  • 检索所有类型 B 的实体

     Base base = this.objectify.load().type(B.class).list();
    

此外,我们希望将所有此类实体作为单一类型(基本实体)存储在 GAE 数据存储中。

我们尝试使用此处描述的相关实体类的多态层次结构:

https://code.google.com/p/objectify-appengine/wiki/Entities#Polymorphism

但这似乎无法处理具有共同父级的多个实体子类的情况。

【问题讨论】:

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


    【解决方案1】:

    我不认为Base 可以是抽象的,但这应该可行:

    @Entity
    class Base { ... }
    
    @EntitySubclass(index=true)
    class A extends Base { ... }
    
    @EntitySubclass(index=true)
    class B extends Base { ... }
    

    如果您希望能够按多态类型查询,则必须索引您要查询的类型。

    【讨论】:

    • 感谢您的回答。这正是我们所做的,但似乎不起作用。我们存储了 ID 为 123456 的对象 B,然后运行查询 - Base base = this.objectify.load().type(A.class).id("123456")。结果,我们得到了具有指定 ID 的对象 B,但是,我们期望什么也得不到,因为我们没有存储任何类型 A 和具有给定 ID 的对象。
    • Load-by-id 为您提供具有指定 id 的实体。它不是使用索引的查询;它只是按键获取 - 无论是什么,它都会被加载。
    • 是的,但是键由实体类型和 ID 组成,我认为使用 ...type(A.class).id("123456") 会将结果限制为给定类型。这可能与实体实际上存储为 Base 类型有关,对吧?
    • 对。就 GAE(和 Objectify)而言,您要求的是具有种类 Base 和指定 id 的东西。这不是查询。我可以理解为什么这会令人困惑,但是 Objectify 显式加载该事物、检查其类型然后将其丢弃似乎很愚蠢。不知道。
    • 最终我意识到它可能会像描述的那样工作(它实际上存储为 Base 类型),但我想确保我没有错过任何东西。谢谢。
    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 2017-10-17
    • 2013-02-02
    • 1970-01-01
    • 2021-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    相关资源
    最近更新 更多