DynamoDB 用の Java アノテーション
このセクションでは、クラスとプロパティを Amazon DynamoDB のテーブルと属性にマッピングするためのアノテーションについて説明します。
関連する Javadoc ドキュメントについては、AWS SDK for Java API リファレンスの「アノテーションタイプの概要」を参照してください。
注記
次の注釈では、DynamoDBTable
と DynamoDBHashKey
だけが必須です。
トピック
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
次の例は、自動生成されたパラメータを使用する方法を示しています。
@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
テーブルがあるとします。各スレッドには多数の返信がある可能性があります。したがってこのテーブルのプライマリキーは、ThreadId
と ReplyDateTime
の両方になります。パーティションキーは 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 およびバージョン番号を使用した楽観的ロック」を参照してください。