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。
我是应用引擎的新手,我想念一些关于 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。