4
boolean r = ofy().transact(new Work<Boolean>() { 

     @Override 
     public Boolean run() { 
      Visit visit = ofy().load().type(Visit.class) 
        .filter(Visit.USER_ID, userID) 
        .filter(Visit.VENUE_ID, venueID).first().get(); 

      if (visit == null) 
       return false; 

      visit.setLastRequestDate(new Date(timestamp)); 

      ofy().save().entity(visit).now(); 
      return true; 
     } 
    }); 

,我得到爲什麼我只得到祖先查詢被允許內部交易錯誤

java.lang.IllegalArgumentException異常:只有祖先查詢被允許內部事務。

用於調用get()的行。
爲什麼?我只在此事務中查詢Visit實體。 我在交易中這樣做,因爲我希望所有這些都是作爲原子操作來執行的。

回答

16

無法在事務內部進行無祖先查詢。您可以在沒有交易的情況下執行此操作,或者使用get代替查詢

,你可以做最接近的是:

  1. 與無交易的祖先少查詢中獲取實體。記住實體的關鍵。
  2. 開始交易。
  3. 通過密鑰獲取實體。
  4. 檢查查詢條件是否仍然適用(=屬性的值仍與查詢條件中的值相同)。通過這種方式,您可以確定自從您執行查詢後實體未發生更改。
  5. 更改&保存實體。提交交易。
+0

謝謝你這是一個偉大的工作,它也將幫助我在另一個查詢。 – RCB

+0

感謝您的解釋是有道理的!我想知道...文檔說你可以訪問xg-transactions中的根實體,但是當我嘗試時,我遇到了這個 –

+0

我很新的w/Objectify ...有人可以清除零件「...將查詢替換爲得到...?」不知道這意味着什麼。謝謝! –

-4

錯誤似乎很清楚:在一個事務中,您只能執行祖先查詢。您的查詢不是祖先查詢。

+0

可以請您詳細說明嗎?祖先查詢是來自同一個實體組的查詢,不是嗎?在我的查詢中,我只有一個實體 – RCB

+1

@RCB - 不,它不是返回一個實體的查詢。祖先查詢是將祖先定義爲查詢條件一部分的查詢。 –

+0

@PeterKnego - 好的,但'Visit'沒有任何祖先(根)。那麼,我該怎麼做?也許,你能給我一個例子嗎? – RCB

相關問題