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

前端之家收集整理的这篇文章主要介绍了java – GAE数据存储:持久引用的对象前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图将 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,setters...
}

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

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

>转换每个此类引用以保存主键(在此示例中为名称字符串)而不是“实际”对象,因此Vector< Child>后代;变为Vector< String> offspringsNames ;?如果是这种情况,我如何在运行时处理对象?我只是从Class.getName查询主键,以检索refrenced对象?
>转换每个这样的引用以保存数据存储在正确的put()操作时提供给我的实际密钥?即,Vector< Child>后代;变为Vector< Key> offspringsHashKeys ;?

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

解决方法

>请参阅以下章节中的google appengine docs以获得更清晰的理解(关系,交易)
>另请阅读JDO中可分离的对象
>要查询选择性列(或字段),请阅读JDO中的fetchgroups

对于您的问题您有几个选择:

>拥有一对多关系(对象将在同一个实体组中)在这里,您可以在父级(父级)中拥有一个Child列表.这会将所有对象放在同一个实体组中.如果您不想在每次获取父级时获取子项,则可以从“默认获取组”中删除子项

@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;
}

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

国际海事组织,如果我在建模一个现实世界(父亲 – 孩子)的场景,我会选择“拥有相关关系”的路线,因为,真的,一个人可以拥有多少个孩子;).当然还有一个问题,即你一次要更新多少父亲?

希望这会有所帮助,欢呼!

猜你在找的Java相关文章