2016-09-30 2 views
1

Ich versuche, objectify Transaktion zu verwenden, aber ich habe einige Probleme, wenn ich ein Objekt neu laden muss in der gleichen Transaktion erstellt.GAE Objectify Ladeobjekt in Transaktion innerhalb derselben Transaktion erstellt

Nehmen Sie diesen Beispielcode

@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"); 
     } 
    } 
}); 

Mein Objekt neu geladen immer null ist, vielleicht habe ich etwas vermissen, aber logisch innerhalb einer Transaktion kann ich ein Objekt abzufragen, die in der gleichen Transaktion erstellt wurde?

Dank

Antwort

0

Cloud Datastor aus relationalen Datenbanken in diesem speziellen Fall unterscheiden. In der Dokumentation, die -

Anders als bei den meisten Datenbanken, Abfragen und innerhalb einer Cloud Datastor Transaktion werden nicht sehen, die Ergebnisse früherer schreibt innerhalb dieser Transaktion. Wenn eine Entität innerhalb von einer Transaktion geändert oder gelöscht wird, gibt eine Abfrage oder eine Suche die ursprüngliche Version der Entität am Anfang der Transaktion zurück, oder nichts, wenn die Entität nicht vorhanden war.

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

+0

Dank für die Beantwortung, ich hoffe, dass objektiviert Griff, dass mit lokalen Cache im Transaktionskontext, aber offensichtlich objektivieren tut dies nicht .. – Benjyyyyy

+0

Wenn Sie ein get-by-Taste in der Transaktion haben , Objectify gibt Ihnen das Objekt, das Sie gespeichert haben (aus dem Sitzungscache). Abfragen werden jedoch an den Abfrageprozessor des Datenspeichers gesendet (es gibt keine Möglichkeit, eine Abfrage aus dem Sitzungscache zu erfüllen), und somit wird die Nullergebnismenge angezeigt. – stickfigure

+0

Dies geht zurück auf "denke an den Datenspeicher als einen Schlüssel-Wert-Speicher mit einigen zusätzlichen Indexierungsverhalten angeschraubt". Das Abfrageverhalten weist einige Besonderheiten auf. – stickfigure

Verwandte Themen