0

我正在使用 Objectify 4 中的事务来更新 Kind_A 的一堆实体。这些有一些我想在事务中修改的字段,还有一些对其他实体的引用,例如

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()使用祖先查询将多个实体作为列表,如下所示:

ofy().load().type(Kind_A.class).ancestor(p).list();

然后我将迭代列表,修改,比如说,name字段(不是Ref<>s),然后ofy().save()是列表。

load()应该拥有相同的所有实体@Parentp),因为它是祖先查询。

因此,从表面上看,当我load()save()我的Kind_A实体时,我正在处理一个实体组 ( p)。

但是,我得到一个IllegalArgumentException: operating on too many entity groups in a single transaction. 我猜这是因为 Objectify 正在加载对象图,包括所有的Kind_Bs 和Kind_Qs。

这个对吗?因此,事务的范围突然扩展到远远超出定义的实体组p

如果是这样,有没有办法告诉 Objectify 忽略事务中的 @Load 注释?

有没有办法(比如在 Eclipse 调试器中)我可以找出参与事务的实体?

任何见解将不胜感激!

4

1 回答 1

0

@Load 忽略事务 - 无论您是否有事务,注释都有效。您可以通过使用分组来控制@Load 的行为,例如@Load(Sometimes.class) 或@Load(unless=Sometimes.class)。

如果您从 @Parent 中删除 @Load 并解决了您的问题,则您的 @Parented 类中可能有额外的 @Load 注释,因此您正在传递更多实体。

谨慎使用@Load。请注意,在 Objectify 4.0rc1 中,您甚至不需要使用 @Load - 当您使用 Ref.get() 时,即使它不是 @Loaded,它也会获取引用的实体。@Load 只是一种优化,以便您可以有效地获取会话缓存。

于 2013-09-03T15:00:13.020 回答