Objectify - 保存Ref <! - ? - > - s的顺序

时间:2017-11-13 10:42:07

标签: google-app-engine objectify

我有一个系统,我试图最小化数据存储区写入的数量(谁不会?),一直使用祖先关系。请考虑以下简化类:

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()操作中也能这样做,那么当祖先被送到数据存储区时,后代的参考资料是否正确填充?

提前感谢您的任何建议!

2 个答案:

答案 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和基础数据存储都不提供任何类型的参照完整性检查。首先保存哪个并不重要。