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)字段,我只需要添加正确的注释.到现在为止还挺好.但是,我不明白我应该如何坚持参考的自酿(儿童,父亲)类型.我是不是该:
Vector<Child> offsprings;变为Vector<String> offspringsNames;?如果是这种情况,我如何在运行时处理对象?我是否只是查询主键Class.getName,以检索refrenced对象?
put()操作时提供给我的实际密钥?那就Vector<Child> offsprings;变成Vector<Key> offspringsHashKeys;?我已经阅读了所有官方相关的GAE文档/示例.在整个过程中,它们始终保持"琐碎"引用,本地由数据存储区支持(例如,在留言簿示例中,仅限字符串和长整数).
请参阅 google appengine 文档以下部分以获得更清晰的理解(关系、交易)
另请阅读 JDO 中的可分离对象
对于你的问题,你有几种选择:
@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,如果我要模拟一个现实世界(父亲和孩子)的场景,我会走“拥有的关系”路线,因为,实际上,一个人可以有多少个孩子;)。当然还有一个问题就是一次要更新多少个父亲?
希望这有帮助,干杯!
| 归档时间: |
|
| 查看次数: |
879 次 |
| 最近记录: |