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

RCB*_*RCB 5 java google-app-engine transactions objectify google-cloud-datastore

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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

我明白了

java.lang.IllegalArgumentException:在事务内只允许祖先查询.

对于有get()电话的线路.
为什么?我只是Visit在这个交易中查询实体.我在一个事务中这样做,因为我希望所有这些都作为原子操作执行.

Pet*_*ego 19

无法在事务中执行无祖先查询.您可以在没有事务的情况下执行此操作或使用get替换查询.

你最接近的是:

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