エンティティ キーの作成と使用

Cloud Datastore 内の各エンティティはキーによって一意に識別されます。キーは次のコンポーネントで構成されています。

  • エンティティの名前空間マルチテナンシーを可能にします。
  • エンティティの種類。Cloud Datastore のクエリ用にエンティティを分類します。
  • 祖先パス(オプション)。Cloud Datastore 階層内のエンティティの位置を特定します。
  • 個々のエンティティの識別子。次のいずれかになります。

    • キー名の文字列
    • 整数の数値 ID

識別子はエンティティ キーの構成要素です。エンティティに永続的に割り当てられるため、変更できません。識別子は、次のいずれかの方法で割り当てます。

  • エンティティに固有のキー名文字列を指定する。
  • Cloud Datastore がエンティティに整数の数値 ID を自動的に割り当てる。

エンティティにキー名を指定する

エンティティにキー名を設定するには、エンティティの作成時にコンストラクタの 2 番目の引数として名前を指定します。

Entity employee = new Entity("Employee", "asalieri");

Cloud Datastore が数値 ID を自動的に割り当てるように設定するには、この引数を省略します。

Entity employee = new Entity("Employee");

識別子を割り当てる

2 つの異なる自動 ID ポリシーを使用して自動 ID を生成するように、Cloud Datastore を構成できます。

  • default ポリシーは未使用の ID をランダムに生成します。この ID はほぼ均等に分布しています。各 ID は最大 16 桁の 10 進数になります。
  • legacy ポリシーは、連続していない小さい整数の ID を生成します。

エンティティの ID をユーザーに表示する場合や、ID の順序に従ってなんらかの処理を行う場合は、手動で割り当てることをおすすめします。

祖先パスを使用する

Cloud Datastore 内のエンティティは、ファイル システムのディレクトリ構造と同様に、階層的に構造化された空間を形成します。エンティティを作成するときに、別のエンティティを親として設定することもできます。新しいエンティティは、この親エンティティの子になります(ファイル システムとは異なり、親エンティティが実際に存在している必要はありません)。親を持たないエンティティは、ルート エンティティとなります。 エンティティと親との割り当ては永続的であり、エンティティの作成後は変更できません。同じ親を持つ 2 つのエンティティ、または 2 つのルート エンティティ(親を持たないエンティティ)に同じ数値 ID が割り当てられることはありません。

エンティティの親、親の親、さらにその親などは順に祖先として位置付けられ、エンティティの子、子の子、さらにその子などは順に子孫として位置付けられます。 ルート エンティティとその子孫のエンティティは、すべて同じエンティティ グループに属します。 ルート エンティティから始まり、親から子を経由して対象のエンティティに至るまでの連なりを、エンティティの祖先パスといいます。 エンティティを識別する完全なキーは、エンティティの祖先パスから始まってそのエンティティ自身で終わる一連の「種類と識別子のペア」で構成されます。

[Person:GreatGrandpa, Person:Grandpa, Person:Dad, Person:Me]

ルート エンティティの場合は祖先パスが空で、エンティティ自身の種類と識別子だけでキーが構成されています。

[Person:GreatGrandpa]

このコンセプトを次の図に示します。

エンティティ グループ内のルート エンティティと子エンティティの関係を示す図

エンティティの親を指定するには、子エンティティの作成時に、親エンティティのキーを Entity() コンストラクタの引数として指定します。このとき指定するキーを取得するには、親エンティティの getKey() メソッドを呼び出します。

Java 8

Entity employee = new Entity("Employee");
datastore.put(employee);

Entity address = new Entity("Address", employee.getKey());
datastore.put(address);

Java 7

Entity employee = new Entity("Employee");
datastore.put(employee);

Entity address = new Entity("Address", employee.getKey());
datastore.put(address);

作成するエンティティにキー名も指定する場合は、Entity() コンストラクタの 2 番目の引数にキー名を指定し、3 番目の引数に親のエンティティ キーを指定します。

Entity address = new Entity("Address", "addr1", employee.getKey());

キーの生成

アプリケーションで KeyFactory クラスを使用すると、既知のコンポーネント(エンティティの種類や ID など)から、エンティティの Key オブジェクトを作成できます。親のないエンティティの場合、種類と ID(キー名の文字列または数値 ID)を静的メソッド KeyFactory.createKey() に渡してキーを作成できます。エンティティの種類 Person とキー名 "GreatGrandpa" または数値 ID 74219 からキーを作成する例を次に示します。

Key k1 = KeyFactory.createKey("Person", "GreatGrandpa");
Key k2 = KeyFactory.createKey("Person", 74219);

キーにパス コンポーネントを含めるには、ヘルパークラス KeyFactory.Builder を使用してパスを作成します。このクラスの addChild メソッドでは、1 つのエンティティがパスに追加され、ビルダーそのものが返されます。したがって、これを連続して呼び出すことにより、ルート エンティティから始めて、エンティティを 1 つずつ追加してパスを構築できます。完全なパスを作成した後、getKey を呼び出して、結果として生成されたキーを取得します。

Java 8

Key k =
    new KeyFactory.Builder("Person", "GreatGrandpa")
        .addChild("Person", "Grandpa")
        .addChild("Person", "Dad")
        .addChild("Person", "Me")
        .getKey();

Java 7

Key k =
    new KeyFactory.Builder("Person", "GreatGrandpa")
        .addChild("Person", "Grandpa")
        .addChild("Person", "Dad")
        .addChild("Person", "Me")
        .getKey();

KeyFactory クラスには静的メソッド keyToStringstringToKey もあり、キーと文字列表現の相互変換に使用できます。

Java 8

String personKeyStr = KeyFactory.keyToString(k);

// Some time later (for example, after using personKeyStr in a link).
Key personKey = KeyFactory.stringToKey(personKeyStr);
Entity person = datastore.get(personKey);

Java 7

String personKeyStr = KeyFactory.keyToString(k);

// Some time later (for example, after using personKeyStr in a link).
Key personKey = KeyFactory.stringToKey(personKeyStr);
Entity person = datastore.get(personKey);

キーの文字列表現は「ウェブセーフ」です。つまり、HTML や URL で特殊文字とみなされる文字は含まれません。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Java 8 の App Engine スタンダード環境