DynamoDB マッピング/ドキュメントのバージョン 1 APIsからバージョン 2 への変更 - AWS SDK for Java 2.x

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

DynamoDB マッピング/ドキュメントのバージョン 1 APIsからバージョン 2 への変更

このトピックでは、Amazon DynamoDB APIs用の Java SDKの高レベルの バージョン 1.x (v1) から AWS SDK for Java 2.x (v2) への変更について詳しく説明します。最初に object-to-table マッピングについて説明APIし、次に JSONスタイルのドキュメントAPIを操作するためのドキュメントについて説明します。

高レベル変更

各ライブラリのマッピングクライアントの名前は、v1 と v2 で異なります。

  • v1 - DynamoDBMapper

  • v2 - DynamoDB 拡張クライアント

2 つのライブラリの操作方法はほぼ同じです。マッパー/クライアントをインスタンス化し、これらの項目を読み書きPOJOAPIsする DynamoDB テーブルに Java を提供します。どちらのライブラリも のクラスに注釈POJOを提供し、クライアントが をどのように処理するかを指示しますPOJO。

v2 に移行するときの顕著な違いは次のとおりです。

  • V2 と v1 は、低レベルの DynamoDB オペレーションに異なるメソッド名を使用します。例:

    v1 v2
    load getItem
    save putItem
    batchLoad batchGetItem
  • V2 には、テーブルスキーマを定義し、テーブルPOJOsにマッピングする複数の方法があります。ビルダーを使用して、コードから生成された注釈またはスキーマの使用から選択できます。V2 は、可変および不変のスキーマバージョンも提供します。

  • v2 では、最初のステップの 1 つとしてテーブルスキーマを具体的に作成しますが、v1 では、テーブルスキーマは必要に応じて注釈付きクラスから推測されます。

  • V2 には拡張APIクライアント にドキュメントクライアント が含まれますがAPI、v1 は別の APIを使用します。

  • すべて APIs v2 の同期バージョンと非同期バージョンで使用できます。

v2 拡張クライアントの詳細については、このガイドの DynamoDB マッピングセクションを参照してください。

依存関係をインポートする

v1 v2
<dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-bom</artifactId> <version>1.X.X</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> </dependency> </dependencies>
<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.X.X*</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>dynamodb-enhanced</artifactId> </dependency> </dependencies>

* 最新バージョン

v1 では、1 つの依存関係に低レベルの DynamoDB APIとマッピング/ドキュメント の両方が含まれますがAPI、v2 では、dynamodb-enhancedアーティファクト依存関係を使用してマッピング/ドキュメント にアクセスしますAPI。dynamodb-enhanced モジュールには、低レベルdynamodbモジュールへの推移的な依存関係が含まれています。

API 変更

クライアントの作成

ユースケース v1 v2

通常のインスタンス化

AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard() .withCredentials(credentialsProvider) .withRegion(Regions.US_EAST_1) .build(); DynamoDBMapper mapper = new DynamoDBMapper(standardClient);
DynamoDbClient standardClient = DynamoDbClient.builder() .credentialsProvider(ProfileCredentialsProvider.create()) .region(Region.US_EAST_1) .build(); DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(standardClient) .build();

最小限のインスタンス化

AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard(); DynamoDBMapper mapper = new DynamoDBMapper(standardClient);
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();

属性トランスフォーマーを使用*

DynamoDBMapper mapper = new DynamoDBMapper(standardClient, attributeTransformerInstance);
DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder() .dynamoDbClient(standardClient) .extensions(extensionAInstance, extensionBInstance) .build();

* v2 の拡張機能は、v1 の属性トランスフォーマーにほぼ対応しています。拡張機能を使用する セクションには、v2 の拡張機能に関する詳細情報が含まれています。

DynamoDB テーブル/インデックスへのマッピングを確立する

v1 では、Bean 注釈を使用して DynamoDB テーブル名を指定します。v2 では、ファクトリメソッド はtable()、リモート DynamoDB テーブルDynamoDbTableを表す のインスタンスを生成します。table() メソッドの最初のパラメータは、DynamoDB テーブル名です。

ユースケース v1 v2

Java POJO クラスを DynamoDB テーブルにマッピングする

@DynamoDBTable(tableName ="Customer") public class Customer { ... }
DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer", TableSchema.fromBean(Customer.class));

DynamoDB セカンダリインデックスへのマッピング

  1. インデックスを表すPOJOクラスを定義します。

    • インデックスを持つテーブルの名前@DynamoDBTableを指定する でクラスに注釈を付けます。

    • プロパティに @DynamoDBIndexHashKeyとオプションで の注釈を付けます@DynamoDBIndexRangeKey

  2. クエリ式を作成します。

  3. インデックスを表すPOJOクラスへの参照を使用してクエリを実行します。例

    mapper.query(IdEmailIndex.class, queryExpression)

    ここで、 IdEmailIndexはインデックスのマッピングクラスです。

v1 メソッドについて説明する DynamoDB デベロッパーガイドの セクションは、完全な例を示しています。query

  1. ( の場合GSI) と @DynamoDbSecondaryPartitionKey ( および GSIまたは @DynamoDbSecondarySortKeyの場合) でPOJOクラスの属性に注釈を付けますLSI。例えば、 などです

    @DynamoDbSecondarySortKey(indexNames = "IdEmailIndex") public String getEmail() { return this.email; }
  2. インデックスへの参照を取得します。例えば、 などです

    DynamoDbIndex<Customer> customerIndex = customerTable.index("IdEmailIndex");
  3. インデックスをクエリします。

このガイドのセカンダリインデックスを使用する「」セクションでは、詳細情報を提供します。

Table operations

このセクションではAPIs、ほとんどの標準ユースケースで v1 と v2 が異なるオペレーションについて説明します。

v2 では、1 つのテーブルを含むすべてのオペレーションが、拡張クライアントではなくDynamoDbTableインスタンスで呼び出されます。拡張クライアントには、複数のテーブルをターゲットにできるメソッドが含まれています。

以下のテーブルのテーブルオペレーションでは、POJOインスタンスは itemまたは を などの特定のタイプと呼びますcustomer1。という名前の v2 の例では、 tableは、DynamoDbTableインスタンスへの参照を返enhancedClient.table()す を以前に呼び出した結果です。

ほとんどの v2 オペレーションは、表示されていない場合でも流暢なコンシューマーパターンで呼び出すことができることに注意してください。例えば、 などです

Customer customer = table.getItem(r → r.key(key)); or Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))

v1 オペレーションの場合、テーブルには一般的に使用されるフォームの一部が含まれており、オーバーロードされたフォームがすべて含まれているわけではありません。例えば、 load()メソッドには次のオーバーロードがあります。

mapper.load(Customer.class, hashKey) mapper.load(Customer.class, hashKey, rangeKey) mapper.load(Customer.class, hashKey, config) mapper.load(Customer.class, hashKey, rangeKey, config) mapper.load(item) mapper.load(item, config)

この表は、一般的に使用される形式を示しています。

mapper.load(item) mapper.load(item, config)
Table operations
ユースケース v1 DynamoDB オペレーション v2

Java を DynamoDB テーブルPOJOに書き込む

mapper.save(item) mapper.save(item, config) mapper.save(item, saveExpression, config)

v1 では、 DynamoDBMapperConfig.SaveBehaviorおよび 注釈によって、呼び出される低レベルの DynamoDB メソッドが決まります。一般的に、 UpdateItemは、 SaveBehavior.CLOBBERと を使用する場合を除き、 と呼び出されますSaveBehavior.PUT。自動生成されたキーは特殊なユースケースであり、 PutItemと の両方UpdateItemが使用されることもあります。

PutItem, UpdateItem
table.putItem(putItemRequest) table.putItem(item) table.putItemWithResponse(item) //Returns metadata. updateItem(updateItemRequest) table.updateItem(item) table.updateItemWithResponse(item) //Returns metadata.
DynamoDB テーブルから Java への項目の読み取り POJO
mapper.load(item) mapper.load(item, config)
GetItem
table.getItem(getItemRequest) table.getItem(item) table.getItem(key) table.getItemWithResponse(key) //Returns POJO with metadata.
DynamoDB テーブルから項目を削除する
mapper.delete(item, deleteExpression, config)
DeleteItem
table.deleteItem(deleteItemRequest) table.deleteItem(item) table.deleteItem(key)
DynamoDB テーブルまたはセカンダリインデックスをクエリし、ページ分割されたリストを返す
mapper.query(Customer.class, queryExpression) mapper.query(Customer.class, queryExpression, mapperConfig)
Query
table.query(queryRequest) table.query(queryConditional)

同期レスポンスと非同期レスポンスPagePublisher.subscribe()には、返された PageIterable.stream() (遅延ロード) を使用します。

DynamoDB テーブルまたはセカンダリインデックスをクエリしてリストを返す
mapper.queryPage(Customer.class, queryExpression) mapper.queryPage(Customer.class, queryExpression, mapperConfig)
Query
table.query(queryRequest) table.query(queryConditional)

同期レスポンスと非同期レスポンスPagePublisher.items.subscribe()には、返された PageIterable.items() (遅延ロード) を使用します。

DynamoDB テーブルまたはセカンダリインデックスをスキャンし、ページ分割されたリストを返します。
mapper.scan(Customer.class, scanExpression) mapper.scan(Customer.class, scanExpression, mapperConfig)
Scan
table.scan() table.scan(scanRequest)

同期レスポンスと非同期レスポンスPagePublisher.subscribe()には、返された PageIterable.stream() (遅延ロード) を使用します。

DynamoDB テーブルまたはセカンダリインデックスをスキャンしてリストを返す
mapper.scanPage(Customer.class, scanExpression) mapper.scanPage(Customer.class, scanExpression, mapperConfig)
Scan
table.scan() table.scan(scanRequest)

同期レスポンスと非同期レスポンスPagePublisher.items.subscribe()には、返された PageIterable.items() (遅延ロード) を使用します。

バッチ内の複数のテーブルから複数の項目を読み取る
mapper.batchLoad(Arrays.asList(customer1, customer2, book1)) mapper.batchLoad(itemsToGet) // itemsToGet: Map<Class<?>, List<KeyPair>>
BatchGetItem
enhancedClient.batchGetItem(batchGetItemRequest) enhancedClient.batchGetItem(r -> r.readBatches( ReadBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addGetItem(i -> i.key(k -> k.partitionValue(0))) .build(), ReadBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addGetItem(i -> i.key(k -> k.partitionValue(0))) .build())) // Iterate over pages with lazy loading or over all items from the same table.
バッチ内の複数のテーブルに複数の項目を書き込む
mapper.batchSave(Arrays.asList(customer1, customer2, book1))
BatchWriteItem
enhancedClient.batchWriteItem(batchWriteItemRequest) enhancedClient.batchWriteItem(r -> r.writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addPutItem(item1) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addPutItem(item2) .build()))
バッチ内の複数のテーブルから複数の項目を削除する
mapper.batchDelete(Arrays.asList(customer1, customer2, book1))
BatchWriteItem
enhancedClient.batchWriteItem(r -> r.writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addDeleteItem(item1key) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addDeleteItem(item2key) .build()))
バッチ内の複数の項目を書き込み/削除
mapper.batchWrite(Arrays.asList(customer1, book1), Arrays.asList(customer2))
BatchWriteItem
enhancedClient.batchWriteItem(r -> r.writeBatches( WriteBatch.builder(Record1.class) .mappedTableResource(mappedTable1) .addPutItem(item1) .build(), WriteBatch.builder(Record2.class) .mappedTableResource(mappedTable2) .addDeleteItem(item2key) .build()))
トランザクション書き込みを実行する
mapper.transactionWrite(transactionWriteRequest)
TransactWriteItems
enhancedClient.transactWriteItems(transasctWriteItemsRequest)
トランザクション読み取りを実行する
mapper.transactionLoad(transactionLoadRequest)
TransactGetItems
enhancedClient.transactGetItems(transactGetItemsRequest)
スキャンまたはクエリの一致する項目の数を取得する
mapper.count(Customer.class, queryExpression) mapper.count(Customer.class, scanExpression)
QueryScan付き Select.COUNT サポートされていません
POJO クラスに対応するテーブルを DynamoDB に作成する
mapper.generateCreateTableRequest(Customer.class)

前のステートメントでは、低レベルのテーブル作成リクエストを生成します。ユーザーは DynamoDB クライアントcreateTableで を呼び出す必要があります。

CreateTable
table.createTable(createTableRequest) table.createTable(r -> r.provisionedThroughput(getDefaultProvisionedThroughput()) .globalSecondaryIndices( EnhancedGlobalSecondaryIndex.builder() .indexName("gsi_1") .projection(p -> p.projectionType(ProjectionType.ALL)) .provisionedThroughput(getDefaultProvisionedThroughput()) .build()));
DynamoDB で並列スキャンを実行する
mapper.parallelScan(Customer.class, scanExpression, numTotalSegments)
Scan Segmentおよび TotalSegmentsパラメータを使用する

ユーザーはワーカースレッドを処理し、各セグメントscanの を呼び出す必要があります。

table.scan(r -> r.segment(0).totalSegments(5))
Amazon S3 を DynamoDB と統合してインテリジェントな S3 リンクを保存する
mapper.createS3Link(bucket, key) mapper.getS3ClientCache()
-

Amazon S3 と DynamoDB が結合されているため、サポートされていません。

マップクラスとプロパティ

v1 と v2 の両方で、Bean スタイルの注釈を使用してクラスをテーブルにマッピングします。V2 には、イミュータブルクラスの使用など、特定のユースケースのスキーマを定義する他の方法もあります。

Bean 注釈

次の表は、v1 および v2 で使用される特定のユースケースに対応する Bean 注釈を示しています。Customer クラスシナリオは、パラメータを説明するために使用されます。

v2 の注釈、クラス、列挙はキャメルケース規則に従いDynamoDb、DynamoDB」ではなく「」を使用します。

ユースケース v1 v2
クラスをテーブルにマップする
@DynamoDBTable (tableName ="CustomerTable")
@DynamoDbBean @DynamoDbBean(converterProviders = {...})
テーブル名は、 DynamoDbEDnhancedClient#table()メソッドを呼び出すときに定義されます。
クラスメンバーをテーブル属性として指定する
@DynamoDBAttribute(attributeName = "customerName")
@DynamoDbAttribute("customerName")
クラスメンバーをハッシュ/パーティションキーとして指定する
@DynamoDBHashKey
@DynamoDbPartitionKey
クラスメンバーを範囲/ソートキーとして指定する
@DynamoDBHashKey
@DynamoDbSortKey
クラスメンバーをセカンダリインデックスのハッシュ/パーティションキーとして指定する
@DynamoDBIndexHashKey
@DynamoDbSecondaryPartitionKey
クラスメンバーをセカンダリインデックス範囲/ソートキーとして指定する
@DynamoDBIndexRangeKey
@DynamoDbSecondarySortKey
テーブルにマッピングするときにこのクラスメンバーを無視する
@DynamoDBIgnore
@DynamoDbIgnore
自動生成されたUUIDキー属性としてクラスメンバーを指定する
@DynamoDBAutoGeneratedKey
@DynamoDbAutoGeneratedUuid

これを提供する拡張機能はデフォルトではロードされません。拡張機能をクライアントビルダーに追加する必要があります。

自動生成されたタイムスタンプ属性としてクラスメンバーを指定する
@DynamoDBAutoGeneratedTimestamp
@DynamoDbAutoGeneratedTimestampAttribute

これを提供する拡張機能はデフォルトではロードされません。拡張機能をクライアントビルダーに追加する必要があります。

クラスメンバーを自動増分バージョン属性として指定する
@DynamoDBVersionAttribute
@DynamoDbVersionAttribute

これを提供する拡張機能は自動ロードされます。

クラスメンバーをカスタム変換を要求するものとして指定する
@DynamoDBTypeConverted
@DynamoDbConvertedBy
別の属性タイプとして保存するクラスメンバーを指定する
@DynamoDBTyped(<DynamoDBAttributeType>)
同等物なし
DynamoDB ドキュメント (JSONスタイルのドキュメント) またはサブドキュメントにシリアル化できるクラスを指定する
@DynamoDBDocument
直接同等の注釈はありません。拡張ドキュメント を使用しますAPI。

V2 の追加注釈

ユースケース v1 v2
Java 値が null の場合、NULL属性として保存されないクラスメンバーを指定する 該当なし
@DynamoDbIgnoreNulls
すべての属性が null の場合は、クラスメンバーを空のオブジェクトに指定します。 該当なし
@DynamoDbPreserveEmptyObject
クラスメンバーの特別な更新アクションを指定する 該当なし
@DynamoDbUpdateBehavior
イミュータブルクラスを指定する 該当なし
@DynamoDbImmutable
クラスメンバーを自動増分カウンター属性として指定する 該当なし
@DynamoDbAtomicCounter

この機能を提供する拡張機能は自動ロードされます。

構成

v1 では、通常、 のインスタンスを使用して特定の動作を制御しますDynamoDBMapperConfig。設定オブジェクトは、マッパーの作成時またはリクエスト時に指定できます。v2 では、設定は オペレーションのリクエストオブジェクトに固有です。

ユースケース v1 v1 のデフォルト v2
DynamoDBMapperConfig.builder()
バッチロードの再試行戦略
.withBatchLoadRetryStrategy(batchLoadRetryStrategy)
失敗した項目を再試行する
バッチ書き込み再試行戦略
.withBatchWriteRetryStrategy(batchWriteRetryStrategy)
失敗した項目を再試行する
整合性のある読み取り
.withConsistentReads(CONSISTENT)
EVENTUAL デフォルトでは、整合性のある読み取りは読み取りオペレーションでは false です。リクエストオブジェクト.consistentRead(true)で をオーバーライドします。
マーシャラー/アンマーシャラーのセットを含む変換スキーマ
.withConversionSchema(conversionSchema)

静的実装は、古いバージョンとの下位互換性を提供します。

V2_COMPATIBLE 該当しません。これは、DynamoDB (v1) の最も古いバージョンがデータ型をどのように保存したかを参照するレガシー機能であり、この動作は拡張クライアントでは保持されません。DynamoDB v1 の動作の例は、ブール値ではなく数値としてブール値を格納することです。
テーブル名
.withObjectTableNameResolver() .withTableNameOverride() .withTableNameResolver()

静的実装は、古いバージョンとの下位互換性を提供します。

クラスから注釈または推測を使用する

テーブル名は、 DynamoDbEDnhancedClient#table()メソッドを呼び出すときに定義されます。

ページ分割ロード戦略
.withPaginationLoadingStrategy(strategy)

オプションは次のとおりです: LAZY_LOADINGEAGER_LOADING、または ITERATION_ONLY

LAZY_LOADING

イテレーションのみがデフォルトです。他の v1 オプションはサポートされていません。

リクエストメトリクスの収集
.withRequestMetricCollector(collector)
null 標準 DynamoDB クライアントを構築するClientOverrideConfigurationときは、 metricPublisher()で を使用します。
保存動作
.withSaveBehavior(SaveBehavior.CLOBBER)

オプションはUPDATE、、CLOBBERPUTAPPEND_SET、または ですUPDATE_SKIP_NULL_ATTRIBUTES

UPDATE

v2 では、 putItem()または をupdateItem()明示的に呼び出します。

CLOBBER or PUT: v 2 の対応するアクションが を呼び出していますputItem()。特定のCLOBBER設定はありません。

UPDATE: に対応 updateItem()

UPDATE_SKIP_NULL_ATTRIBUTES: に対応しますupdateItem()。リクエスト設定ignoreNullsと注釈/タグ を使用して更新動作を制御しますDynamoDbUpdateBehavior

APPEND_SET: サポートされていません

タイプコンバータファクトリ
.withTypeConverterFactory(typeConverterFactory)
標準タイプコンバータ

を使用して Bean に を設定する

@DynamoDbBean(converterProviders = {ConverterProvider.class, DefaultAttributeConverterProvider.class})

オペレーションごとの設定

v1 では、 などの一部のオペレーションはquery()、オペレーションに送信された「式」オブジェクトを使用して高度に設定できます。例:

DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>() .withRangeKeyCondition("Email", new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList( new AttributeValue().withS("my"))); mapper.query(Customer.class, emailBwQueryExpr);

v2 では、設定オブジェクトを使用する代わりに、ビルダーを使用してリクエストオブジェクトにパラメータを設定します。例:

QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder() .queryConditional(QueryConditional .sortBeginsWith(kb -> kb .sortValue("my"))).build(); customerTable.query(emailBw);

条件付き

v2 では、条件式とフィルタリング式は、条件と名前とフィルターのマッピングをカプセル化する Expression オブジェクトを使用して表現されます。

ユースケース オペレーション v1 v2
予想される属性条件 save()、delete()、query()、Scan()
new DynamoDBSaveExpression() .withExpected(Collections.singletonMap( "otherAttribute", new ExpectedAttributeValue(false))) .withConditionalOperator(ConditionalOperator.AND);
廃止されました。ConditionExpression代わりに を使用してください。
条件式 delete()
deleteExpression.setConditionExpression("zipcode = :zipcode") deleteExpression.setExpressionAttributeValues(...)
Expression conditionExpression = Expression.builder() .expression("#key = :value OR #key1 = :value1") .putExpressionName("#key", "attribute") .putExpressionName("#key1", "attribute3") .putExpressionValue(":value", AttributeValues.stringValue("wrong")) .putExpressionValue(":value1", AttributeValues.stringValue("three")) .build(); DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder() .conditionExpression(conditionExpression).build();
フィルター式 query(), scan()
scanExpression .withFilterExpression("#statename = :state") .withExpressionAttributeValues(attributeValueMapBuilder.build()) .withExpressionAttributeNames(attributeNameMapBuilder.build())
Map<String, AttributeValue> values = singletonMap(":key", stringValue("value")); Expression filterExpression = Expression.builder() .expression("name = :key") .expressionValues(values) .build(); QueryEnhancedRequest request = QueryEnhancedRequest.builder() .filterExpression(filterExpression).build();
クエリの条件式 query()
queryExpression.withKeyConditionExpression()
QueryConditional keyEqual = QueryConditional.keyEqualTo(b -> b .partitionValue("movie01")); QueryEnhancedRequest tableQuery = QueryEnhancedRequest.builder() .queryConditional(keyEqual) .build();

型変換

デフォルトコンバータ

v2 では、 はすべての一般的なタイプのデフォルトコンバータのセットSDKを提供します。タイプコンバータは、プロバイダーレベル全体と単一の属性の両方で変更できます。使用可能なコンバータのリストは、 AttributeConverterAPIリファレンスで確認できます。

属性のカスタムコンバーターを設定する

v1 では、getter メソッドに で注釈を付けて@DynamoDBTypeConverted、Java 属性タイプと DynamoDB 属性タイプの間で変換するクラスを指定できます。例えば、Java Currencyタイプと DynamoDB 文字列を変換CurrencyFormatConverterする は、次のスニペットに示すように適用できます。

@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class) public Currency getCurrency() { return currency; }

前のスニペットに相当する v2 を以下に示します。

@DynamoDbConvertedBy(CurrencyFormatConverter.class) public Currency getCurrency() { return currency; }
注記

v1 では、属性自体、タイプ、またはユーザー定義の注釈に注釈を適用できます。v2 では、ゲッターにのみ注釈を適用できます。

タイプコンバーターファクトリまたはプロバイダーを追加する

v1 では、独自のタイプコンバーターのセットを提供するか、タイプコンバーターファクトリを設定に追加することで、関心のあるタイプをオーバーライドできます。タイプコンバータファクトリは を拡張しDynamoDBTypeConverterFactory、オーバーライドはデフォルトセットへの参照を取得して拡張することによって行われます。次のスニペットは、これを行う方法を示しています。

DynamoDBTypeConverterFactory typeConverterFactory = DynamoDBTypeConverterFactory.standard().override() .with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() { @Override public String convert(CustomBoolean bool) { return String.valueOf(bool.getValue()); } @Override public CustomBoolean unconvert(String string) { return new CustomBoolean(Boolean.valueOf(string)); }}).build(); DynamoDBMapperConfig config = DynamoDBMapperConfig.builder() .withTypeConverterFactory(typeConverterFactory) .build(); DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);

V2 は、 @DynamoDbBean アノテーションを通じて同様の機能を提供します。1 つの AttributeConverterProviderまたは順序付けられた のチェーンを指定できますAttributeConverterProvider。独自の属性コンバータープロバイダーチェーンを指定する場合、デフォルトのコンバータープロバイダーをオーバーライドし、その属性コンバーターを使用するにはチェーンに含める必要があることに注意してください。

@DynamoDbBean(converterProviders = { ConverterProvider1.class, ConverterProvider2.class, DefaultAttributeConverterProvider.class}) public class Customer { ... }

このガイドの属性変換に関するセクションには、v2 の完全な例が含まれています。

ドキュメント API

ドキュメントは、DynamoDB テーブルでの JSONスタイルのドキュメントの単一項目としての使用APIをサポートします。v1 ドキュメントAPIは v2 APIで対応する を持っていますが、v1 APIのようにドキュメントに別のクライアントを使用する代わりに、v2 は DynamoDB 拡張クライアントにドキュメントAPI機能を組み込みます。

v1 では、 Item クラスは DynamoDB テーブルの非構造化レコードを表します。v2 では、非構造化レコードは EnhancedDocument クラスのインスタンスによって表されます。プライマリキーは、v2 のテーブルスキーマと v1 の項目自体で定義されていることに注意してください。

次の表は、v1 と v2 APIsのドキュメントの違いを比較したものです。

ユースケース v1 v2
ドキュメントクライアントを作成する
AmazonDynamoDB client = ... //Create a client. DynamoDB documentClient = new DynamoDB(client);
// The v2 Document API uses the same DynamoDbEnhancedClient // that is used for mapping POJOs. DynamoDbClient standardClient = ... //Create a standard client. DynamoDbEnhancedClient enhancedClient = ... // Create an enhanced client.
テーブルを参照する
Table documentTable = docClient.documentClient("Person");
DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("Person", TableSchema.documentSchemaBuilder() .addIndexPartitionKey(TableMetadata.primaryIndexName(),"id", AttributeValueType.S) .attributeConverterProviders(AttributeConverterProvider.defaultProvider()) .build());
Work with semi-structured data
項目を配置する
Item item = new Item() .withPrimaryKey("id", 50) .withString("firstName", "Shirley"); PutItemOutcome outcome = documentTable.putItem(item);
EnhancedDocument personDocument = EnhancedDocument.builder() .putNumber("id", 50) .putString("firstName", "Shirley") .build(); documentTable.putItem(personDocument);
項目を取得する
GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50); Item personDocFromDb = outcome.getItem(); String firstName = personDocFromDb.getString("firstName");
EnhancedDocument personDocFromDb = documentTable .getItem(Key.builder() .partitionValue(50) .build()); String firstName = personDocFromDb.getString("firstName");
Work with JSON items
JSON 構造を変換してドキュメントで使用する API
// The 'jsonPerson' identifier is a JSON string. Item item = new Item().fromJSON(jsonPerson);
// The 'jsonPerson' identifier is a JSON string. EnhancedDocument document = EnhancedDocument.builder() .json(jsonPerson).build());
配置 JSON
documentTable.putItem(item)
documentTable.putItem(document);
読み取り JSON
GetItemOutcome outcome = //Get item. String jsonPerson = outcome.getItem().toJSON();
String jsonPerson = documentTable.getItem(Key.builder() .partitionValue(50).build()) .fromJson();

API ドキュメントのリファレンスとガイド APIs

v1 v2
API リファレンス Javadoc Javadoc
ドキュメントガイド Amazon DynamoDB デベロッパーガイド 拡張ドキュメント API (このガイド)

FAQ

Q: バージョン番号を使用したオプティミスティックロックは、v2 でも v1 と同じように機能しますか?

A. 動作は似ていますが、v2 は削除オペレーションの条件を自動的に追加しません。削除動作を制御する場合は、条件式を手動で追加する必要があります。