我目前使用此模式来存储也是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
- 注释。
答案 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);
}