【问题标题】:How to store classes containing Lists of classes that also contain Lists using GAE and Objectify?如何存储包含使用 GAE 和 Objectify 的列表的类列表的类?
【发布时间】:2012-05-06 08:05:24
【问题描述】:

我有一个类似于以下的 Java 模型:

public class Country {
    @Id private String id;
    private CurrencyId currencyId;
    private List<Province> provinceList;
    ...
}

public class Province {
    @Id private String id;
    private Gobernor gobernorId;
    private List<City> cityList;
    ...
}

public class City {
    @Id private String id;
    private String name;
    ...
}

我想使用 objectify 存储该数据。但是,由于国家/地区数据可能会发生变化,我还想存储国家/地区数据的存储日期,所以我认为我应该存储一个实体,例如:

public class CountryListEntity {
    @Id private String id;
    private List<Country> countryList;
    private Date storeDate;
}

请注意,如果我可以这样存储它,我将只有一个 ID 为“root”的 CountryListEntity 实体。我对谷歌应用程序如何存储数据以及 objectify 的工作原理知之甚少。我尝试了许多@Embedded 的组合,但我遇到了很多错误,即

不能在@Embedded 数组或集合中放置数组或集合属性

谁能告诉我如何定义这些类?非常感谢存储和检索此“根”实体所需的代码的 sn-p!

【问题讨论】:

  • 我不明白CountryListEntity 的含义。您想添加国家对象修改日期吗?在这种情况下,来自 Objectify 的 @PrePersist 注释可能会有所帮助。
  • 不清楚您在这里要做什么。您想将国家、省、市存储为单独的实体,它们之间有链接吗?您想将此信息嵌入到单个实体中吗?您应该阅读 Objectify 中的概念文档和 GAE SDK 中的存储数据文档。
  • @stickfigure 我实际上不在乎它们是否是独立的实体。我将一次存储/加载所有数据,所以当我读到可以存储列表时,我认为存储国家列表也意味着存储省和城市。如果这是不可能的,仍然可以将它们存储为单独的实体。

标签: google-app-engine objectify


【解决方案1】:

@Embedded 集合在 低级实体。这就是为什么你只能做一层嵌入。

如果您要一次存储/加载所有数据,并且您的实体与示例中的实体一样简单,您可以将列表的 @Serialized 注释放在 @Embedded 列表中。

您可以通过this discussion了解更多信息。

这种方法的问题是您的低级嵌入将无法被索引。

public class CountryListEntity {
    @Id private String id;

    @Embedded 
    private List<Country> countryList;

    private Date storeDate;
}

public class Country implements Serializable {
    private String id;
    private CurrencyId currencyId;

    @Serialized
    private List<Province> provinceList;
    // ...
}

public class Province implements Serializable {
    private String id;
    private Gobernor gobernorId;

    @Serialized
    private List<City> cityList;
    // ...
}

public class City implements Serializable {
    private String id;
    private String name;
    // ...
}

【讨论】:

  • 我试图避免@Serialized,但似乎没有其他方法(除了单独存储每个实体)。只是一些关于代码的cmets。所有@Id,但来自CountryListEntity 的那个不是必需的。此外,除CountryListEntity 之外的所有类都必须实现Serializable。至少这是文档所说的,并且在遵循这些步骤之后,它工作正常。谢谢!
  • 是的,很抱歉没有提到Serializable接口,我已经按照你的建议更新了答案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-08
  • 2018-05-05
  • 2013-11-09
  • 2015-11-08
相关资源
最近更新 更多