2016-09-30 8 views
1

オブジェクト化トランザクションを使用しようとしましたが、同じトランザクションで作成されたオブジェクトをリロードする必要があるときに問題があります。GAE同じトランザクション内のトランザクションで作成されたロードオブジェクトのオブジェクト化

マイオブジェクトのリロードは常にnullである

@Entity 
public class MyObject 
{ 
    @Parent 
    Key<ParentClass> parent; 

    @Index 
    String foo; 
} 


ofy().transact(new VoidWork() 
{ 
    @Override 
    public void vrun() 
    { 
     ParentClass parent = load();// load the parent 
     String fooValue = "bar"; 

     Key<ParentClass> parentKey = Key.create(ParentClass.class, parent.getId()) 
     MyObject myObject = new MyObject(parentKey); 
     myObject.setFoo(fooValue); 

     ofy().save().entity(myObject).now(); 

     MyObject reloaded = ofy().load().type(MyObject.class).ancestor(parentKey).filter("foo", fooValue).first().now(); 

     if(reloaded == null) 
     { 
      throw new RuntimeException("error"); 
     } 
    } 
}); 

このサンプルコード乗り、多分私は何かを逃したが、論理的にトランザクション内で、私は同じトランザクションで作成されたオブジェクトを照会することができますか?

答えて

0

Cloud Datastoreのは、この特定のケースでは、リレーショナルデータベースとは異なり

感謝。 、ほとんどのデータベースとは異なり

クエリやクラウドデータストア トランザクション内でその トランザクション内、前の書き込みの結果が表示されない取得します - ドキュメントがあることを述べています。具体的には、トランザクションが トランザクション内でエンティティが変更または削除された場合、クエリまたは参照はトランザクションの開始時点で エンティティの元のバージョンを返します。 エンティティが存在しなかった場合は何も返しません。答えるため

https://cloud.google.com/datastore/docs/concepts/transactions#isolation_and_consistency

+0

おかげで、私は客観ハンドルがローカル・トランザクション・コンテキスト内のキャッシュが、明らかに客観化してこれを行わないことをことを願っています。.. – Benjyyyyy

+0

あなたがやった場合は、GETバイキー取引でObjectifyは(セッションキャッシュから)保存したオブジェクトを提供します。ただし、クエリはデータストアのクエリプロセッサに送信されます(セッションキャッシュからクエリを満たす方法はありません)。したがって、null結果セットが表示されます。 – stickfigure

+0

これは、「データストアをキー値ストアとして考えることで、いくつかの追加のインデックス作成動作がオンになっている」となります。クエリ動作にはいくつかの癖があります。 – stickfigure

関連する問題