次のエンティティのセットがある場合:
A --> (unowned) B
\
--> (owned) List<C>
D --> (owned) List<E> --> (owned) List<F> --> (unowned) A
\
--> (unowned) H
G --> (unowned) H
\
--> (unowned) D
\
--> (unowned) B
\
--> (unowned) A
\
--> (unowned) F
\
--> (unowned) F
トランザクションでこれらすべてのオブジェクトに触れている場合、4 つのエンティティ グループ (A、B、D、H) を数えます。これは許可する必要があります (ドキュメントによると、最大 5 つまで持つことができます)。
2 つの質問: 1) それらをどのように取得/作成するかは重要ですか? つまり
C c = new C(a);
a.getCs().add(c);
親子関係にもかかわらず、どういうわけか2つの別々のエンティティグループを使用していますか? それとも、G が F の 2 つの異なる値を持っているという事実 - それは 2 つのエンティティ グループですか、それとも 1 つですか?
2) オブジェクトにアクセスすると、どのくらい深くなりますか? つまり、私も持っている場合
D --> (owned) List<K> --> (owned) List<L> --> (unowned) M
K、L、または M にアクセスしていなくても、appengine はトランザクションでアクセスされるエンティティ グループのリストに M を含めますか?
私は概念的な観点から自分のオブジェクト モデルにかなり満足しています (appengine がなければ、同じようにもう一度設計するだろうと確信しています)。すべての親?
あるいは、これがデータベースの世界では些細なことだとすると、DataStore for Cloud SQL を 6 か月でやめた人はどれくらいいるでしょうか? (おそらく、最後はスタックオーバーフローにとって主観的すぎるかもしれませんが、それは本物の質問です)
アップデート
すべてをデバッグするために生成されたログを調べた後、ある時点で次の行が表示されることがわかります。
24634 [1419746043@qtp-647750325-2] DEBUG DataNucleus.Persistence - Performing reachability algorithm on object with id "com.google.appengine.api.datastore.Key:D("alex@hotmail.com")"
その後、そのルート エンティティからアクセスできるすべてのオブジェクトを大量に取得します。これには、所有されていない (つまり、アクセスされたエンティティを親として使用していない) エンティティが多数含まれているため、これがトランザクションの失敗の原因であると推測し、Q2 への回答は「どこにでも'
だから... Q3 - どうすればこの動作を防ぐことができますか? 変更された F の 2 つのインスタンスを永続化するために、makePersistent(D) を呼び出していることに注意してください。