Eager-Load List <ref <t>&gt; </ref <t>的所有条目

时间:2014-11-26 18:14:39

标签: java objectify google-cloud-datastore

我目前使用此模式来存储也是Objectify实体的类型列表:

@Entity
class Test{
    private List<Ref<T>> data = new ArrayList<>();

    public List<T> getTees(){
        List<T> tmp = new ArrayList<>(this.data.size()); // Is the entire list loaded here?
        for (Ref<T> d : this.data) {
            tmp.add(d.get()); // or every single entry here??
        }
        return tmp;
    }
}

问题是:第一次使用data字段时,会从数据存储中加载整个列表(Ref&#34;指向&#34;到的数据),或者Ref<T>.get() - 方法会单独加载每个条目吗?

如果是这样,如何一次性批量加载整个列表?

注意:我并不总是需要列表,这就是为什么它没有@Load - 注释。

1 个答案:

答案 0 :(得分:4)

Objectify不会加载引用的任何内容,除非您明确.get(),这会导致单个提取,或者您告诉它通过@Load自动加载所有内容。这加快了整体加载速度,因为它可以批量处理请求,而不是形成几个单独的请求。

如果通过&#34;我不总是需要列表&#34;你的意思是你有不同的需要&#34;需要&#34; vs&#34;不需要&#34;,看看加载组,基本上可以打开或关闭@Load注释。

https://code.google.com/p/objectify-appengine/wiki/Entities#Relationships有你的例子 https://code.google.com/p/objectify-appengine/wiki/BasicOperations#Load_Groups打开/关闭自动加载


有一种方法可以使用
在一个批次中加载Ref列表 Map<Key<T>,T> Loader#refs(Iterable<Ref<T>> refs)

public List<T> getTees(){
    Collection<T> values = ofy().load().refs(data).values();
    return new ArrayList<T>(values);
}