如何使用GAE和Objectify存储包含列表的类,这些类还包含列表?

时间:2012-05-06 08:05:25

标签: google-app-engine objectify

我有一个类似于:

的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实体,如果我可以像那样存储它。我对谷歌应用程序如何存储数据以及对象的工作原理知之甚少。我尝试了许多@Embedded的组合,但是我遇到了很多错误,即

  

无法在@Embedded数组或集合中放置数组或集合属性

有谁能告诉我如何定义这些类?存储和检索此“根”实体所需的代码片段将非常受欢迎!

1 个答案:

答案 0 :(得分:2)

@Embedded集合被转换为一系列的集合字段 低级实体。这就是为什么你可以做的一个级别的嵌入。

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

您可以从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;
    // ...
}