我试图将
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
>另请阅读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; }
在这种情况下,您必须管理参照完整性,并确保它们在同一个实体组中,如果您必须在单个事务中更新/添加它们
国际海事组织,如果我在建模一个现实世界(父亲 – 孩子)的场景,我会选择“拥有相关关系”的路线,因为,真的,一个人可以拥有多少个孩子;).当然还有一个问题,即你一次要更新多少父亲?
希望这会有所帮助,欢呼!