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

相关问题