【问题标题】:Are Objectify @Load annotations obeyed in transactions?事务中是否遵循 Objectify @Load 注释?
【发布时间】:2013-09-03 13:28:50
【问题描述】:

我正在使用 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 的一个实例定义的,它会有自己的Refs,例如:

class Kind_P {
  @Id Long id;

  @Load
  Ref<Kind_Q> q;
}

在我的事务中,我将使用祖先查询将ofy().load() 多个实体作为列表,如下所示:

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

然后我将迭代列表,修改例如 name 字段(不是 Ref&lt;&gt;s),然后是 ofy().save() 列表。

load() 的所有实体都应该具有相同的@Parent (p),因为它是祖先查询。

因此,从表面上看,当我 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 调试器中)我可以找出参与事务的实体?

任何见解将不胜感激!

【问题讨论】:

  • 更新:删除@Parent 上的@Load 注释似乎可以解决问题,但我想知道这是意料之中还是巧合。跨度>

标签: java google-app-engine objectify


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多