Java Objectify:我想念父母和孩子

时间:2016-06-29 13:17:26

标签: google-app-engine objectify

我是Appengine的新手,我想念亲子关系。当然,文档总是非常轻松......

我定义了这个

@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);

  }
}

(我在这里压制吸气剂)

这是孩子:一排。

然后父母

@Entity
public class StockTable {

  @Id public String table;

  private StockTable () {}
}

非常简单。

我有两个问题:

我想要一个包含多行的表格。表包含具有相同ID的行。 因此,Stocktable的ID是其所有行共享的ID。

1)这是正确的做法吗?

StockRow必须是实体,因为我从Datastore查询它们。 也许它是容器,但我不明白......

或者定义父母可能没用?

2)如何为给定的id加载所有孩子?

我在Objectif wiki上看过这个,但这个查询的目的不是很明确:

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

我首先不知道par内部是什么,其次我觉得这种负荷不是我想要的。

谢谢!

2 个答案:

答案 0 :(得分:0)

是的,这是正确的方法。 $(function() { setInterval(function() { startRefresh(); }, 3000) }); function startRefresh() { $.post('pollchat.php', function(data) { $('#content_div_id').html(data); $('#content_div_id').scrollTop($('#content_div_id')[0].scrollHeight);//scrolls to bottom of div #content_div_id }); } 是父级,具有多个StockTable,而行ID仅适用于每个表。

为表加载所有子项:

StockRow

答案 1 :(得分:0)

你的设计似乎很好。实体由其类型,其祖先及其字符串或数字ID唯一标识。使用当前模型,假设您创建一个名称为“A”的StockTable实体(由Java类中的表字段标记)。然后,添加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实体。

至于问题:“或者定义一个父母可能没用?”

除了设计原因之外,有一个很好的理由来定义祖先。没有祖先的“顶级”实体定义“实体组”。在您的示例中,每个唯一的StockTable都代表一个实体组。单个实体组内的数据存储区查询(例如,读取此StockTable中的所有StockRows)可保证一致的结果,因此您知道它们是最新的。在多个实体组中返回结果的查询仅保证最终一致的结果,这些结果可能不是最新的,并且可能无法反映数据的单个一致快照。您可以阅读更多相关信息here