我有一个系统,我试图最小化数据存储区写入的数量(谁不会?),一直使用祖先关系。请考虑以下简化类:
public class Ancestor {
@Id
private String id;
private String field;
private Ref<Descendant> descendantRef;
public Descendant getDescendant() {
return this.descendantRef.get();
}
public void setDescendant(Descendant des) {
this.descendantRef = Ref.create(des);
}
}
public class Descendant {
@Id
private String id;
private String field;
@Parent
private Key parent;
}
我的问题:即使我设置了后代ref,在保存祖先实体后,保存了null
,但如果我也保存了后代,Objectify会抱怨Attempted to save a null entity
。
我的问题:我认为Objectify使用get()
注释优化了@Load
操作的顺序,所以有没有办法让它在save()
操作中也能这样做,那么当祖先被送到数据存储区时,后代的参考资料是否正确填充?
提前感谢您的任何建议!
答案 0 :(得分:0)
您可以隐藏此实现,如下所示:
public Descendant getDescendant() {
// You probably don't want to break your code on null descendantRef
if (this.descendantRef != null) {
return this.descendantRef.get();
}
return null;
}
public void setDescendant(Descendant des) {
// Insert if this des have never been insert
if (getDescendant() != null) {
new DescendantEndpoint().insert(des);
}
// You probably don't want to break your code on null des
if (des != null) {
this.descendantRef = Ref.create(des);
}
}
通过这种方式,您无需在每个端点上处理每个插入ref。但是,此方法未针对批量插入进行优化,因为它将插入到每个单独的数据存储区连接上。
为此你可以这样做:
private Object bulkInsertAncestor(ArrayList<Ancestor> list){
ArrayList<Descendant> descendantArrayList = //get descendant list
// You should do all this inside a transaction
new DescendantEndpoint().bulkInsertDescendant(descendantArrayList);
return ofy().save().entities(list);
}
答案 1 :(得分:0)
Objectify只会抱怨你Attempted to save a null entity
,如果你真的将null
值传递给save()方法。
这不是一个操作顺序问题。 FWIW,Objectify和基础数据存储都不提供任何类型的参照完整性检查。首先保存哪个并不重要。