Objectify @Load注释是否在交易中被遵守?

时间:2013-09-03 13:28:50

标签: java google-app-engine objectify

我在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()的所有实体应该具有相同的@Parentp),因为它是祖先查询。

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

但是,我得到IllegalArgumentException: operating on too many entity groups in a single transaction。我猜这是因为Objectify正在加载对象图,包括所有Kind_BKind_Q s。

这是对的吗?因此,交易的范围突然扩散到p定义的实体组之外。

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

有没有办法(比方说,Eclipse调试器)我可以找出参与交易的实体?

非常感谢任何见解!

1 个答案:

答案 0 :(得分:0)

@Load无视交易 - 无论您是否有交易,注释都有效。您可以使用分组来控制@Load的行为,例如@Load(Sometimes.class)或@Load(除非= Sometimes.class)。

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

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