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;
}
});
and I get
java.lang.IllegalArgumentException: Only ancestor queries are allowed inside transactions.
for the line with the get()
call.
why? I'm only querying Visit
entity in this transaction.
I'm doing this in a transaction, because I want all this to be performed as atom operation.
No way to do ancestor-less query inside a transaction. Either you do it without transactions or replace query with get.
The closest that you can do is:
- Get entity with ancestor-less query without transaction. Remember key of the entity.
- Start transaction.
- Get entity via the key.
- Check that query condition still applies (= properties still have the same values as in query conditions). This way you can be sure entity was not changed since you did the query.
- Change & save entity. Commit transaction.
The error seems quite clear: inside a transaction, you're only allowed to perform ancestor queries. Your query is not an ancestor query.
来源:https://stackoverflow.com/questions/14397207/why-do-i-get-only-ancestor-queries-are-allowed-inside-transactions-error