DynamoDB 用の Java アノテーション - Amazon DynamoDB

DynamoDB 用の Java アノテーション

このセクションでは、クラスとプロパティを Amazon DynamoDB のテーブルと属性にマッピングするためのアノテーションについて説明します。

関連する Javadoc ドキュメントについては、AWS SDK for Java API リファレンスの「アノテーションタイプの概要」を参照してください。

注記

次の注釈では、DynamoDBTableDynamoDBHashKey だけが必須です。

DynamoDBAttribute

テーブルの属性にプロパティをマッピングします。デフォルトでは、各クラスのプロパティが、同じ名前の項目属性にマッピングされます。ただし名前が同じでない場合は、この注釈を使用して属性にプロパティをマッピングすることができます。次の Java コードスニペットでは、DynamoDBAttribute によって、BookAuthors プロパティがテーブル内の 属性名にマッピングされています。Authors

@DynamoDBAttribute(attributeName = "Authors") public List<String> getBookAuthors() { return BookAuthors; } public void setBookAuthors(List<String> BookAuthors) { this.BookAuthors = BookAuthors; }

DynamoDBMapper では、テーブルにオブジェクトを保存する際に、 を属性名として使用しています。Authors

DynamoDBAutoGeneratedKey

パーティションキーまたはソートキーのプロパティは、自動生成済みとしてマーキングされます。DynamoDBMapper では、これらの属性を保存するときにランダムな UUID が生成されます。String プロパティには、自動生成済みのキーとしてマーキングできます。

次の例は、自動生成されたパラメータを使用する方法を示しています。

@DynamoDBTable(tableName="AutoGeneratedKeysExample") public class AutoGeneratedKeys { private String id; private String payload; @DynamoDBHashKey(attributeName = "Id") @DynamoDBAutoGeneratedKey public String getId() { return id; } public void setId(String id) { this.id = id; } @DynamoDBAttribute(attributeName="payload") public String getPayload() { return this.payload; } public void setPayload(String payload) { this.payload = payload; } public static void saveItem() { AutoGeneratedKeys obj = new AutoGeneratedKeys(); obj.setPayload("abc123"); // id field is null at this point DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient); mapper.save(obj); System.out.println("Object was saved with id " + obj.getId()); } }

DynamoDBAutoGeneratedTimestamp

タイムスタンプを自動生成します。

@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS) public Date getLastUpdatedDate() { return lastUpdatedDate; } public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }

オプションで、戦略属性を指定して自動生成戦略を定義できます。デフォルト: ALWAYS

DynamoDBDocument

Amazon DynamoDB ドキュメントにあるように、クラスは連番で作成できます。

例えば、JSON ドキュメントを Map 型 (M) の DynamoDB 属性にマッピングしたい場合を考えます。次のサンプルコードでは、マップ型の入れ子の属性 (Pictures) を含む項目を定義します。

public class ProductCatalogItem { private Integer id; //partition key private Pictures pictures; /* ...other attributes omitted... */ @DynamoDBHashKey(attributeName="Id") public Integer getId() { return id;} public void setId(Integer id) {this.id = id;} @DynamoDBAttribute(attributeName="Pictures") public Pictures getPictures() { return pictures;} public void setPictures(Pictures pictures) {this.pictures = pictures;} // Additional properties go here. @DynamoDBDocument public static class Pictures { private String frontView; private String rearView; private String sideView; @DynamoDBAttribute(attributeName = "FrontView") public String getFrontView() { return frontView; } public void setFrontView(String frontView) { this.frontView = frontView; } @DynamoDBAttribute(attributeName = "RearView") public String getRearView() { return rearView; } public void setRearView(String rearView) { this.rearView = rearView; } @DynamoDBAttribute(attributeName = "SideView") public String getSideView() { return sideView; } public void setSideView(String sideView) { this.sideView = sideView; } } }

以下の例に示されているように、ProductCatalog と合わせて、新しい Pictures 項目を保存することができます。

ProductCatalogItem item = new ProductCatalogItem(); Pictures pix = new Pictures(); pix.setFrontView("http://example.com/products/123_front.jpg"); pix.setRearView("http://example.com/products/123_rear.jpg"); pix.setSideView("http://example.com/products/123_left_side.jpg"); item.setPictures(pix); item.setId(123); mapper.save(item);

その結果、ProductCatalog 項目は次のようになります (JSON 形式)。

{ "Id" : 123 "Pictures" : { "SideView" : "http://example.com/products/123_left_side.jpg", "RearView" : "http://example.com/products/123_rear.jpg", "FrontView" : "http://example.com/products/123_front.jpg" } }

DynamoDBHashKey

テーブルのパーティションキーにクラスプロパティをマッピングします。このプロパティは、スカラー文字列型、数値型、バイナリ型のいずれかである必要があります。コレクション型は使用できません。

ProductCatalog がプライマリキーである Id テーブルがあるとします。次の Java コードでは、CatalogItem クラスを定義し、その Id プロパティを ProductCatalog タグを使用して @DynamoDBHashKey テーブルのプライマリキーにマッピングしています。

@DynamoDBTable(tableName="ProductCatalog") public class CatalogItem { private Integer Id; @DynamoDBHashKey(attributeName="Id") public Integer getId() { return Id; } public void setId(Integer Id) { this.Id = Id; } // Additional properties go here. }

DynamoDBIgnore

DynamoDBMapper インスタンスに対して、関連するプロパティを無視するように指示します。テーブルにデータを保存する場合、DynamoDBMapper ではこのプロパティがテーブルに保存されません。

モデリングされていないプロパティの getter メソッドまたはクラスフィールドに適用されます。注釈がクラスフィールドに直接適用されている場合、対応する getter および setter が同じクラスで宣言される必要があります。

DynamoDBIndexHashKey

グローバルセカンダリインデックスのパーティションキーに、クラスプロパティをマッピングします。このプロパティは、スカラー文字列型、数値型、バイナリ型のいずれかである必要があります。コレクション型は使用できません。

グローバルセカンダリインデックスを Query したい場合に、このアノテーションを使用します。インデックス名(globalSecondaryIndexName)を指定する必要があります。クラスプロパティの名前がインデックスのパーティションキーと異なる場合、そのインデックス属性の名前 (attributeName) も指定する必要があります。

DynamoDBIndexRangeKey

グローバルセカンダリインデックスまたはローカルセカンダリインデックスのソートキーにクラスプロパティをマッピングします。このプロパティは、スカラー文字列型、数値型、バイナリ型のいずれかである必要があります。コレクション型は使用できません。

このアノテーションは、ローカルセカンダリインデックスもしくはグローバルセカンダリインデックスを Query し、その結果をインデックスのソートキーを使用して絞り込む必要がある場合に使用します。インデックス名(globalSecondaryIndexName または localSecondaryIndexName)を指定する必要があります。クラスプロパティの名前がインデックスのソートキーと異なる場合、そのインデックス属性の名前 (attributeName) も指定する必要があります。

DynamoDBRangeKey

テーブルのソートキーにクラスプロパティをマッピングします。このプロパティは、スカラー文字列型、数値型、バイナリ型のいずれかである必要があります。コレクション型は使用できません。

プライマリキーが複合の場合 (パーティションキーとソートキー)、このタグを使用して、クラスフィールドをソートキーにマッピングできます。たとえば、フォーラムスレッドからの返信を格納する Reply テーブルがあるとします。各スレッドには多数の返信がある可能性があります。したがってこのテーブルのプライマリキーは、ThreadIdReplyDateTime の両方になります。パーティションキーは ThreadId で、ソートキーは ReplyDateTime です。

たとえば次の Java コードでは、Reply クラスを定義して、Reply テーブルにマッピングしています。ここでは、@DynamoDBHashKey タグと @DynamoDBRangeKey タグの両方を使用して、プライマリキーにマッピングされるクラスプロパティを識別しています。

@DynamoDBTable(tableName="Reply") public class Reply { private Integer id; private String replyDateTime; @DynamoDBHashKey(attributeName="Id") public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @DynamoDBRangeKey(attributeName="ReplyDateTime") public String getReplyDateTime() { return replyDateTime; } public void setReplyDateTime(String replyDateTime) { this.replyDateTime = replyDateTime; } // Additional properties go here. }

DynamoDBTable

DynamoDB 内でターゲットテーブルを識別します。例えば、次の Java コードでは Developer クラスを定義して、DynamoDB の People テーブルにマッピングしています。

@DynamoDBTable(tableName="People") public class Developer { ...}

@DynamoDBTable 注釈は継承できます。Developer クラスから継承された新しいクラスも、People テーブルにマッピングされます。たとえば、Lead クラスから継承された Developer クラスを作成したとします。Developer クラスを People テーブルにマッピングしたことで、Lead クラスオブジェクトも同じテーブルに格納されます。

@DynamoDBTable もオーバーライドできます。デフォルトで Developer クラスから継承された新しいクラスは、同じ People テーブルにマッピングされます。ただし、このデフォルトのマッピングはオーバーライドできます。たとえば、Developer クラスから継承したクラスを作成した場合には、次の Java サンプルコードに示すように、@DynamoDBTable 注釈を追加することで、別のテーブルに明示的にマッピングできます。

@DynamoDBTable(tableName="Managers") public class Manager extends Developer { ...}

DynamoDBTypeConverted

カスタム型コンバーターの使用時にプロパティをマークする注釈を使用できます。DynamoDBTypeConverter に追加のプロパティを渡すために、ユーザーが定義した注釈でコメントすることもできます。

DynamoDBTypeConverter インターフェイスでは、独自の任意データ型を、DynamoDB でネイティブにサポートされているデータ型にマッピングすることができます。詳細については、「DynamoDB での任意のデータのマッピング」を参照してください。

DynamoDBTyped

標準属性タイプの追加を上書きする注釈を使用できます。そのタイプでデフォルト属性のバインドを適用する場合、スタンダードの種類には注釈を必要としません。

DynamoDBVersionAttribute

オプティミスティックロックのバージョン番号を格納するためのクラスプロパティを識別します。DynamoDBMapper は、新しい項目を保存するときにこのプロパティにバージョン番号を割り当てます。バージョン番号は項目を更新するたびに増えていきます。サポートされているのは番号によるスカラー型だけです。 のデータ型の詳細については、「」を参照してくださいデータ型 バージョニングの詳細については、「DynamoDB およびバージョン番号を使用した楽観的ロック」を参照してください。