0

私は Objectify 4 でトランザクションを使用して、Kind_A の一連のエンティティを更新しています。これらには、トランザクション内で変更したいフィールドが多数ありますが、他のエンティティへの参照も多数あります。

class Kind_A {
  @Id Long id;

  @Parent
  @Load
  Ref<Kind_P> parent;

  String name;

  @Load
  Ref<Kind_B> b;
}

ここでのエンティティ グループは、独自Refの sを持つ Kind_P のインスタンスによって定義されます。

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

これは正しいです?そのため、トランザクションの範囲は、 で定義されたエンティティ グループを超えて突然広がっていますp

もしそうなら、Objectify にトランザクション内の @Load アノテーションを無視するように指示する方法はありますか?

(Eclipse デバッガーなどで) トランザクションに参加しているエンティティを見つける方法はありますか?

どんな洞察も大歓迎です!

4

1 に答える 1

0

@Load はトランザクションを認識しません。トランザクションがあるかどうかに関係なく、アノテーションは機能します。@Load(Sometimes.class) や @Load(unless=Sometimes.class) などのグループ化を使用して、@Load の動作を制御できます。

@Parent から @Load を削除して問題が解決した場合、 @Parented クラスに @Load アノテーションが追加されている可能性が高いため、より多くのエンティティを推移的にプルしています。

@Load は控えめかつ慎重に使用してください。Objectify 4.0rc1 では、@Load を使用する必要さえないことに注意してください。@Load は、セッション キャッシュへのフェッチを効率的に行うための単なる最適化です。

于 2013-09-03T15:00:13.020 に答える