在实地存储实例

时间:2016-10-25 20:09:22

标签: google-app-engine objectify

首先,我确信这个问题对于任何对Objectify有经验的人来说都是微不足道的 - 然而,遗憾的是我没有。

说我有一个名为大学的POJO。其中一个领域是教授名单(其中教授也是POJO)。有什么区别:

    private List<Professor> professors;
    private List<Ref<Professor>> professors;

说,我想用“教授X”和“教授Y”作为教授给数据库写“abcUni”。

稍后,我加载abcUni。当我加载abcUni时,是否还会加载professorX和professorY实例?或者我是否需要将列表表示为private List<Ref<Professor>> professors2;,然后使用相应的密钥直接访问数据存储区中的每个实例?

2 个答案:

答案 0 :(得分:0)

因为我认为教授名单不是你所拥有的任何大学实体的唯一名单,而是大学之间共享的实体集合,可以更新,修改并将这些变化反映在所有大学实体中,根本无法使用您的第一线方法。

基本上它说要客观地存储一份教授名单,这些名单对你们任何一所大学来说都是独一无二的。如果教授改变了大学,那么同一位教授的其他大学也不会有任何变化。这太乱了。

使用您的第二行,您实际上是通过他们的密钥引用所有数据存储共享的教授实体,这是正确的方法(您将任何大学实体的所有密钥存储到教授实体中相对于那所大学而言)。

关于加载:当您从数据存储中检索Univerisity对象时,您还会检索所有教授的密钥,但只检索它们(而不是整个POJO)。

University fetchedUni = ofy().load().key(univKey).now();
//you have fetched the uni object from datastore, with a list of Professor objects keys 

然后,您可以使用objectify get方法实际访问数据存储区以获取与您的大学对象中的Ref键对应的对象:

List<Professor> profs = fetchedUni.professors.get();
//now you have fetched the entire POJOs list

如果出于任何原因(优化,经济,无论哪种方式),您希望通过数据存储区中的独特批处理操作将您所有推荐的教授全部POJO与您的大学实体一起获取,您可以添加 @Load 注释。查看更多here

答案 1 :(得分:0)

private List<Ref<Professor>> professors;将教授数据嵌入大学。在RDBMS-land中,它使数据非规范化。没有单独和独立的教授实体。

Key将链接(在低级@Load s)存储到独立且独立的教授实体。如果您希望Objectify在您获取大学时总是批量获取教授,则可以添加Ref<?>注释。

基本上Key<?>只是$http,而且行为更多。您想要链接还是希望将数据嵌入更大的文档?