Java 客观化:我想念一些关于 Parent 和 Children 的东西

Java Objectify : I miss something about Parent and Children

我是应用引擎的新手,我想念一些关于 Parent-Children 关系的东西。当然,文档一如既往地非常简单...

我定义了这个

@Entity
public class StockRow {

  @Parent Key<StockTable> table;
  @Id Long id;
  Long quantity;
  String status;
  String type;
  String table;

  private StockRow () {}

  public StockRow (String tableName, com.google.appengine.api.datastore.Entity queryResult) {

    id = queryResult.getKey().getId();
    quantity = (Long) queryResult.getProperty("quantity");
    status = (String) queryResult.getProperty("status");
    type = (String) queryResult.getProperty("stock-name");

    table = StockTable = Key.create(StockTable.class, tableName);

  }
}

(我在这里抑制吸气剂)

这是 Children : 一行。

然后Parent

@Entity
public class StockTable {

  @Id public String table;

  private StockTable () {}
}

很简单。

关于这个我有两个问题:

我想要 table 几行。 table 包含具有相同 ID 的行。 所以 Stocktable 的 ID 是其所有行共享的 ID。

1) 这是正确的做法吗?

StockRow 必须是实体,因为我从数据存储中查询它们。 可能是 Container 但我不明白...

或者定义一个 parent 没用?

2) 如何加载给定 id 的所有 children?

我在 Objectif wiki 上读到了这个,但是这个查询的目的不是很清楚:

Thing th = ofy().load().type(Thing.class).parent(par).id(123L).now();

不知道里面装的是什么par一来二来感觉这个负载不是我想要的

谢谢!

是的,这是一个正确的方法。 StockTable 是父级,有多个 StockRow,并且行 ID 仅在每个 table.

中是唯一的

加载 table 的所有子项:

StockTable table = ...;
List<StockRow> rows = ofy().load()
                           .type(StockRow.class) //target type
                           .ancestor(table) //parent entity or just key
                           .list(); //all of them

你的设计看起来不错。实体由其种类、祖先及其字符串或数字 ID 唯一标识。使用您当前的模型,假设您创建了一个名称为 "A" 的 StockTable 实体(由 Java class 中的 table 字段标记)。然后,添加 ID 为 100 和 200 的 StockRow 实体。

StockTable 键为:

[StockTable/"A"]

StockRow 键为:

[StockTable/"A", StockRow/100]
[StockTable/"A", StockRow/200]

Objectify 允许您通过单独指定每个片段来查询这些键:

List<StockRow> rows = ObjectifyService.ofy()
    .type(StockRow.class)
    .ancestor(Key.create(StockTable.class, "A"))
    .id(100)
    .list();

您还可以通过省略 .id(...) 调用来查询 StockTable "A" 中的所有 StockRow 实体。

至于问题:"Or maybe it's useless to define a parent?"

在设计原因之外定义祖先是有充分理由的。 "top level" 没有祖先的实体定义 "entity groups." 在您的示例中,每个唯一的 StockTable 将代表一个实体组。单个实体组中的数据存储区查询(例如,读取此 StockTable 中的所有 StockRow)保证高度一致的结果,因此您知道它们是最新的。 return 在多个实体组中产生的查询只能保证最终一致的结果,这些结果可能不是最新的,也可能不会反映数据的单一、一致的快照。您可以阅读更多相关信息 here