GAE数据存储区:持久引用的对象

Dav*_*vid 7 java google-app-engine google-cloud-datastore

我试图将Java对象持久化到GAE数据存储区.

我不确定如何持久化具有("非平凡")引用对象的对象.也就是说,假设我有以下内容.

public class Father {
    String name;
    int age;
    Vector<Child> offsprings; //this is what I call "non-trivial" reference 
    //ctor, getters, setters...
}

public class Child {
    String name;
    int age;
    Father father; //this is what I call "non-trivial" reference 
    //ctor, getters, setters...
}
Run Code Online (Sandbox Code Playgroud)

名称字段在每个类型域中都是唯一的,并且被视为主键.

为了保持"普通"(String,int)字段,我只需要添加正确的注释.到现在为止还挺好.但是,我不明白我应该如何坚持参考的自酿(儿童,父亲)类型.我是不是该:

  1. 将每个这样的引用转换为保存主键(在本例中为名称String)而不是"实际"对象,所以Vector<Child> offsprings;变为Vector<String> offspringsNames;

    如果是这种情况,我如何在运行时处理对象?我是否只是查询主键Class.getName,以检索refrenced对象?

  2. 转换每个这样的引用以保存数据存储在正确put()操作时提供给我的实际密钥?那就Vector<Child> offsprings;变成Vector<Key> offspringsHashKeys;

我已经阅读了所有官方相关的GAE文档/示例.在整个过程中,它们始终保持"琐碎"引用,本地由数据存储区支持(例如,在留言簿示例中,仅限字符串和长整数).

nai*_*kus 0

  • 请参阅 google appengine 文档以下部分以获得更清晰的理解(关系、交易)

  • 另请阅读 JDO 中的可分离对象

  • 要查询选择性列(或字段),请阅读 JDO 中的 fetchgroup

对于你的问题,你有几种选择:

  • 拥有的一对多关系(对象将位于同一实体组中)在这里,您可以在父级(父亲类)中拥有子级列表。这会将所有对象放置在同一实体组中。如果您不想每次获取父亲时都获取孩子,可以将孩子从“默认获取组”中删除

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Father {
   @PrimaryKey
   @Persistent
   private String name;

   @Persistent
   private int age;

   @Persistent(mappedBy = "father", defaultFetchGroup = "false")
   private List childern;
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Child   {
   @Persistent
   @PrimaryKey
   private String name;

   @Persistent
   private Father dad;
}

  • 您存储键而不是引用的无主关系:

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Father {

   @PrimaryKey
   @Persistent
   private String name;

   @Persistent
   private int age;

   @Persistent
   private List childern;
}

@PersistenceCapable(identityType = IdentityType.APPLICATION, detachable = "true")
public class Child   {
   @Persistent
   @PrimaryKey
   private String name;

   @Persistent
   private Key dad;
}

在这种情况下,如果您必须在单个事务中更新/添加它们,您将必须管理引用完整性,并确保它们位于同一实体组中

IMO,如果我要模拟一个现实世界(父亲和孩子)的场景,我会走“拥有的关系”路线,因为,实际上,一个人可以有多少个孩子;)。当然还有一个问题就是一次要更新多少个父亲?

希望这有帮助,干杯!