2016-09-30 65 views
1

我嘗試使用objectify事務,但當我需要重新加載在同一事務中創建的對象時,我遇到了一些問題。GAE Objectify在同一事務內的事務中創建的加載對象

把這個示例代碼

@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

雲數據存儲在此特例中與關係數據庫不同。該文檔狀態 -

不像大多數數據庫,查詢並得到一個雲存儲 事務中沒有看到 事務中先前寫入的結果。具體而言,如果某個實體在事務中被修改或刪除,則查詢或查找會在交易開始時返回原始版本的 實體,或者如果 實體不存在,則返回該實體。

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

+0

謝謝回答,我希望客觀化處理與事務上下文中本地緩存,但顯然客體不這樣做.. – Benjyyyyy

+0

如果你做了一個get-通過鑰匙在交易,Objectify會給你保存的對象(來自會話緩存)。但是,查詢會提交給數據存儲的查詢處理器(無法滿足來自會話緩存的查詢),因此您會看到空結果集。 – stickfigure

+0

這可以追溯到「將數據存儲視爲鍵值存儲,其中一些額外的索引行爲被閂上了」。查詢行爲有一些怪癖。 – stickfigure