【问题标题】:Objectify and entity groups对象化和实体组
【发布时间】:2011-11-06 05:24:08
【问题描述】:

这是所有 objectify/app 引擎专家的问题:

我通过将父对象的键存储在子对象中来创建具有父/子关系的对象。 这存储在 Key 类型的对象中。例如,假设我有一个汽车对象和轮胎对象。 轮胎对象将父键存储在 Key 类型的变量中。

@Entity
Public class Tire{
     @Id Long id;
     Key<Car> ParentKey;

     int size;
}

在我的应用程序中,我需要获取特定汽车的所有轮胎。我可以通过查询来做到这一点: 轮胎轮胎 = oft.query(Tire.class).filter("ParentKey",carKey).get();

这是实现此目的的适当方法吗?这会导致实体组出现任何问题吗?这对大量汽车和轮胎来说是否有效?

【问题讨论】:

    标签: google-app-engine persistence objectify


    【解决方案1】:

    我使用完全相同的方式 - 没问题。

    我看不出与实体组有任何冲突,而且它适用于大型组(至少对于数千个实体)

    附:如果您需要获取属于同一组的数据 - 您不需要使用 GAE 组。更重要的是:实体组最适合交易,而不是过滤。

    【讨论】:

    • 我想到的另一个问题是如果更新父实体会发生什么?这不会更改该实体的密钥,从而使存储在子实体中的密钥无效吗?
    • 如果您更新父实体,而不更改其 ID - 不会更改密钥。 Key 只是实体 ID 的扩展包装器。而且,如果您知道实体的 ID/名称 - 您可以自己构建它,没有问题,例如 new Key&lt;Car&gt;(Car.class, 100)。它的功能与 ID == 100 实体的已存储密钥相同,并且可以毫无问题地存储
    【解决方案2】:

    现在您没有创建父/子关系,至少按照app engine 的定义。查看文档:添加父/子关系可以加快速度,因为汽车及其轮胎将物理存储在一起,但如果在某些时候不再需要它们,它们可能很难移除。

    要使用 Objectify 创建父/子关系,请添加 @Parent 注释:

    // Use com.googlecode.objectify.Key instead of 
    // com.google.appengine.api.datastore.Key
    @Parent Key<Car> parentKey;
    

    现在,为了获取属于特定汽车的所有轮胎:

    List<Tyre> tires = ofy().query(Tyre.class).ancestor(carKey).list();
    

    【讨论】:

    • 我可以看到这将如何更有效率。此方法仅通过属于汽车的轮胎进行迭代。如果我需要检查所有汽车的所有轮胎怎么办?这会造成实体组问题,对吧?
    • @Patric,你确定你需要实体分组吗?它主要用于交易
    • 据我了解,只要有交易,就会形成实体组,例如创建具有父关系的轮胎。这将汽车及其轮胎置于一个实体中。至少这是我的理解。我想知道是否可以在所有轮胎与父关系存储时直接查询它们。
    • 这种父/子关系不会将汽车和轮胎放在同一个实体中。它们将是独立的实体,但您将受益于能够使用交易(正如@Patrick 指出的那样),以及带有轮胎的特定汽车将物理存储在同一个 disk中的事实>。而且,查询所有轮胎也没有问题。因为它们是不同的实体,所以您可以简单地执行ofy().query(Tyre.class).list() 之类的操作。
    • 好的。伟大的。听起来 Objectify 摆脱了使用 JDO 和 JPA 进行查询的一些问题。谢谢。你得到接受的答案!
    猜你喜欢
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多