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

boolean r = ofy().transact(new Work() { @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实体。 我在一个事务中这样做,因为我希望所有这些都作为primefaces操作执行。

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

你最接近的是:

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

错误似乎很清楚:在事务内部,您只能执行祖先查询。 您的查询不是祖先查询。