为什么我得到只有祖先查询被允许在事务内部错误

时间:2013-01-18 10:43:41

标签: java google-app-engine transactions google-cloud-datastore objectify

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

1 个答案:

答案 0 :(得分:18)

无法在事务中执行无祖先查询。您可以在没有事务的情况下执行此操作,也可以使用get。

替换查询

你最接近的是:

  1. 在没有事务的情况下获取具有无祖先查询的实体。记住实体的关键。
  2. 开始交易。
  3. 通过密钥获取实体。
  4. 检查查询条件是否仍然适用(=属性仍具有与查询条件中相同的值)。通过这种方式,您可以确保在执行查询后实体未被更改。
  5. 改变&amp;保存实体。提交交易。