内でクエリを実行する必要がありますがTransaction
、エンティティ @Id はわかりません。ユーザー名のようなフィールドの値がありますが、ID はありません。
つまり、Key
クエリを実行する を作成できません。内のエンティティを取得するクエリを実行するにはどうすればよいTransaction
ですか?
内でクエリを実行する必要がありますがTransaction
、エンティティ @Id はわかりません。ユーザー名のようなフィールドの値がありますが、ID はありません。
つまり、Key
クエリを実行する を作成できません。内のエンティティを取得するクエリを実行するにはどうすればよいTransaction
ですか?
設計上の問題を深く掘り下げることなく、実際には 2 つのオプションがあります。
1) トランザクションの外でクエリを実行します。
Objectify (この投稿にタグを付けました) を使用すると、トランザクション内であっても非トランザクション クエリを簡単に実行できます。トランザクションに関連付けられていない新しい ofy インスタンスを生成し、それを使用してクエリを実行するだけです...その後、トランザクションでの作業に戻ります。これはトランザクションから抜け出し、操作の整合性に影響を与える可能性があることに注意してください。多くの場合、それは問題ではありません。
Objectify4 を使用している場合は、次のように操作を実行できます。
ofy.transactionless.load().type(Thing.class).filter("field", value)...etc
2) 検索エンティティを使用する
これは通常、ユーザー名などを扱う場合の正しい答えです。次のように、ユーザー名を User オブジェクトにマップする別のエンティティを作成します。
class Username {
@Id String username;
Key<User> user;
}
ユーザーを作成するたびに XG トランザクションを使用してユーザー名を作成し、ユーザー名の変更を許可する場合はそれを更新します。ここで、ユーザー名でユーザーのトランザクション ルックアップを実行するには、まずユーザー名をルックアップし、それを使用してユーザーをルックアップします。