6
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在此事务中查询实体。我在事务中执行此操作,因为我希望所有这些都作为原子操作执行。

4

2 回答 2

20

无法在事务中进行无祖先查询。要么在没有事务的情况下执行此操作,要么将查询替换为 get。

您可以做的最接近的是:

  1. 获取具有无祖先查询的实体,无需事务。记住实体的键。
  2. 开始交易。
  3. 通过密钥获取实体。
  4. 检查查询条件是否仍然适用(= 属性仍然具有与查询条件相同的值)。通过这种方式,您可以确保实体在您进行查询后没有更改。
  5. 更改并保存实体。提交事务。
于 2013-01-18T14:00:54.537 回答
-5

错误似乎很明显:在事务中,您只被允许执行祖先查询。您的查询不是祖先查询。

于 2013-01-18T11:40:50.467 回答