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 に答える