我在Objectify 4中使用一个事务来更新Kind_A的一堆实体。它们在事务中有许多我想要修改的字段,但也有许多其他实体的Refs,例如
class Kind_A {
@Id Long id;
@Parent
@Load
Ref<Kind_P> parent;
String name;
@Load
Ref<Kind_B> b;
}
我的实体组是由Kind_P的实例定义的,它将具有自己的Ref
s,例如:
class Kind_P {
@Id Long id;
@Load
Ref<Kind_Q> q;
}
在我的交易中,我将使用祖先查询ofy().load()
许多实体作为List,如下所示:
ofy().load().type(Kind_A.class).ancestor(p).list();
然后我将迭代列表,修改,比如name
字段(不是Ref<>
s),然后ofy().save()
列表。
我load()
的所有实体应该具有相同的@Parent
(p
),因为它是祖先查询。
所以,从表面上看,当我load()
和save()
我的Kind_A
实体时,我正在处理一个实体组(p
)。
但是,我得到IllegalArgumentException: operating on too many entity groups in a single transaction
。我猜这是因为Objectify正在加载对象图,包括所有Kind_B
和Kind_Q
s。
这是对的吗?因此,交易的范围突然扩散到p
定义的实体组之外。
如果是这样,有没有办法告诉Objectify忽略交易中的@Load注释?
有没有办法(比方说,Eclipse调试器)我可以找出参与交易的实体?
非常感谢任何见解!
答案 0 :(得分:0)
@Load无视交易 - 无论您是否有交易,注释都有效。您可以使用分组来控制@Load的行为,例如@Load(Sometimes.class)或@Load(除非= Sometimes.class)。
如果从@Parent中删除@Load并解决了您的问题,那么您的@Parented类中可能会有额外的@Load注释,因此您可以传递更多实体。
谨慎小心地使用@Load。请注意,在Objectify 4.0rc1中,您甚至不需要使用@Load - 当您使用Ref.get()时,它将获取引用的实体,即使它不是@Loaded。 @Load只是一个优化,因此您可以高效地获取会话缓存。