

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Alterações no trabalho com o DynamoDB da versão 1 para a versão 2 do AWS SDK para Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [Diferenças da API de mapeamento do DynamoDB entre a versão 1 e a versão 2 do AWS SDK para Java](ddb-mapping.md)
+ [Documente as diferenças da API entre a versão 1 e a versão 2 do AWS SDK para Java](dynamodb-mapping-document-api.md)
+ [Migração da biblioteca de criptografia](ddb-encryption-lib-migrate.md)

# Diferenças da API de mapeamento do DynamoDB entre a versão 1 e a versão 2 do AWS SDK para Java
<a name="ddb-mapping"></a>

O APIs mapeamento do DynamoDB mudou significativamente entre a versão 1 e a versão 2 do. AWS SDK para Java Na versão 1, você usa o `DynamoDBMapper` para trabalhar com Java POJOs. Na versão 2, você usa o `DynamoDbEnhancedClient` com nomes de métodos atualizados, opções aprimoradas de definição de esquema e segurança de tipo aprimorada.

As principais diferenças incluem:
+ Novos nomes de métodos (como `getItem` em vez de `load`)
+ Criação explícita de esquema de tabela
+ Suporte incorporado para operações síncronas e assíncronas
+ Mudanças na forma como as strings vazias e a configuração são tratadas

Esta seção aborda as alterações da API de mapeamento, as diferenças de anotação, as atualizações de configuração e as diretrizes de migração para ajudar você a fazer a transição de `DynamoDBMapper` v1 para `DynamoDbEnhancedClient` v2.

**Contents**
+ [Alterações de alto nível nas bibliotecas de mapeamento da versão 1 para a versão 2 do SDK para Java](dynamodb-mapping-high-level.md)
  + [Importar diferenças de dependência](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Alterações no APIs mapeamento do DynamoDB entre a versão 1 e a versão 2 do SDK for Java](dynamodb-mapping-api-changes.md)
  + [Criar um cliente](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Estabelecer o mapeamento para tabela/índice do DynamoDB](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Operações de tabela](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Classes e propriedades de mapa](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Anotações de bean](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [Anotações adicionais da V2](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Configuração](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Configuração por operação](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Condicionais](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Conversão de tipo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Conversores padrão](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Definir um conversor personalizado para um atributo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Adicionar uma fábrica ou fornecedor de conversor de tipo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [Diferenças de gerenciamento de strings entre a versão 1 e a versão 2 do SDK para Java](dynamodb-migration-string-handling.md)
+ [Diferenças de bloqueio positivo entre a versão 1 e a versão 2 do SDK para Java](dynamodb-migrate-optimstic-locking.md)
+ [Diferenças de setters fluentes entre a versão 1 e a versão 2 do SDK para Java](dynamodb-migrate-fluent-setters.md)

# Alterações de alto nível nas bibliotecas de mapeamento da versão 1 para a versão 2 do SDK para Java
<a name="dynamodb-mapping-high-level"></a>

Os nomes do cliente de mapeamento em cada biblioteca diferem da V1 para a V2:
+ V1 - Dínamo DBMapper
+ V2: Cliente Aprimorado do DynamoDB

Você interage com as duas bibliotecas da mesma forma: instancia uma mapper/client e, em seguida, fornece um Java POJO para APIs essa leitura e gravação desses itens nas tabelas do DynamoDB. Ambas as bibliotecas também oferecem anotações para a classe do POJO para direcionar como o cliente lida com o POJO. 

As principais diferenças quando você muda para a V2 incluem:
+ A V2 e a V1 usam nomes de métodos diferentes para as operações de baixo nível do DynamoDB. Por exemplo:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ A V2 oferece várias maneiras de definir esquemas de tabela e POJOs mapear para tabelas. Você pode escolher entre o uso de anotações ou um esquema gerado a partir do código usando um compilador. A V2 também oferece versões mutáveis e imutáveis dos esquemas.
+ Com a V2, você cria especificamente o esquema da tabela como uma das primeiras etapas, enquanto na V1, o esquema da tabela é inferido da classe anotada conforme necessário.
+ A V2 inclui o [cliente da API de documentos](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) na API de cliente aprimorado, enquanto a V1 usa uma [API separada](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html).
+ Todos APIs estão disponíveis nas versões síncrona e assíncrona na V2.

Consulte informações mais detalhadas sobre o cliente aprimorado da V2 na [seção de mapeamento do DynamoDB](dynamodb-enhanced-client.md) deste guia.

## Importar diferenças de dependência
<a name="dynamodb-mapping-deps"></a>


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

\$1 [Versão mais recente](https://central.sonatype.com/artifact/software.amazon.awssdk/bom)

Na V1, uma única dependência inclui tanto a API de baixo nível do DynamoDB quanto a API, enquanto na V2, você usa mapping/document `dynamodb-enhanced` a dependência do artefato para acessar a API. mapping/document O módulo `dynamodb-enhanced` contém uma dependência transitiva do módulo de baixo nível`dynamodb`. 

# Alterações no APIs mapeamento do DynamoDB entre a versão 1 e a versão 2 do SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Criar um cliente
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Instanciação normal  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard()<br />    .withCredentials(credentialsProvider)<br />    .withRegion(Regions.US_EAST_1)<br />    .build();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbClient standardClient = DynamoDbClient.builder()<br />    .credentialsProvider(ProfileCredentialsProvider.create())<br />    .region(Region.US_EAST_1)<br />    .build();<br />DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .build();</pre>  | 
|   Instanciação mínima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Com transformador de atributo\$1  |  <pre>DynamoDBMapper mapper = new DynamoDBMapper(standardClient, <br />                        attributeTransformerInstance);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()<br />    .dynamoDbClient(standardClient)<br />    .extensions(extensionAInstance, extensionBInstance)<br />    .build();</pre>  | 

\$1As extensões na V2 correspondem aproximadamente aos transformadores de atributos na V1. A seção [Usar extensões para personalizar as operações do Cliente Aprimorado do DynamoDB](ddb-en-client-extensions.md) contém mais informações sobre extensões na V2. 

## Estabelecer o mapeamento para tabela/índice do DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Na V1, você especifica um nome de tabela do DynamoDB por meio de uma anotação de bean. Na V2, um método de fábrica, `table()`, produz uma instância de `DynamoDbTable` que representa a tabela remota do DynamoDB. O primeiro parâmetro do método `table()` é o nome da tabela do DynamoDB.


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Mapear a classe Java POJO para a tabela do DynamoDB  |  <pre>@DynamoDBTable(tableName ="Customer")<br />public class Customer {<br />  ...<br />}</pre>  |  <pre>DynamoDbTable<Customer> customerTable = enhancedClient.table("Customer",<br />    TableSchema.fromBean(Customer.class));</pre>  | 
|   Mapear para um índice secundário do DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) A seção do Guia do desenvolvedor do DynamoDB que discute[ o método `query` da V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) mostra um exemplo completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) A seção [Usar índices secundários](ddb-en-client-use-secindex.md) deste guia fornece mais informações.  | 

## Operações de tabela
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Esta seção descreve as operações APIs que diferem entre V1 e V2 na maioria dos casos de uso padrão. 

Na V2, todas as operações que envolvem uma única tabela são chamadas na instância `DynamoDbTable`, não no cliente aprimorado. O cliente aprimorado contém métodos que podem ter como destino várias tabelas. 

Na tabela chamada *Operações de tabela* abaixo, uma instância POJO é chamada de `item` ou como um tipo específico, como `customer1`. Para os exemplos da V2 de as instâncias nomeadas, `table` é o resultado de uma chamada anterior a `enhancedClient.table()` que retorna uma referência à instância `DynamoDbTable`.

Observe que a maioria das operações da V2 pode ser chamada com um padrão de consumidor fluente, mesmo quando não mostrado. Por exemplo,

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

Para operações da V1, as *Operações de tabela* (abaixo) contêm algumas das formas mais usadas, mas não todas as formas com sobrecargas. Por exemplo, o método `load()` tem as seguintes sobrecargas:

```
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)
```

As *Operações de tabela* (abaixo) mostram as formas comumente usados:

```
mapper.load(item)
mapper.load(item, config)
```


**Operações de tabela**  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|  Gravar um Java POJO em uma tabela do DynamoDB **Operação do DynamoDB:** `PutItem`, `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Na V1, `DynamoDBMapperConfig.SaveBehavior` e anotações determinam qual método de baixo nível do DynamoDB será chamado. Em geral, `UpdateItem` é chamado, exceto quando se usa `SaveBehavior.CLOBBER` e `SaveBehavior.PUT`. As chaves geradas automaticamente são um caso de uso especial e, ocasionalmente, tanto `PutItem` como `UpdateItem` são usadas.  |  <pre>table.putItem(putItemRequest)<br />table.putItem(item)<br />table.putItemWithResponse(item) //Returns metadata.<br /><br />updateItem(updateItemRequest)<br />table.updateItem(item)<br />table.updateItemWithResponse(item) //Returns metadata.</pre>  | 
|  Ler um item de uma tabela do DynamoDB para um Java POJO **Operação do DynamoDB:** `GetItem`  |  <pre>mapper.load(item)<br />mapper.load(item, config)</pre>  |  <pre>table.getItem(getItemRequest)<br />table.getItem(item)<br />table.getItem(key)<br />table.getItemWithResponse(key) //Returns POJO with metadata.</pre>  | 
|  Excluir um item de uma tabela do DynamoDB **Operação do DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada **Operação do DynamoDB:** `Query`  |  <pre>mapper.query(Customer.class, queryExpression)<br />mapper.query(Customer.class, queryExpression, <br />                             mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> Usar o `PageIterable.stream()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.subscribe()` para respostas assíncronas  | 
|  Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista **Operação do DynamoDB:** `Query`  |  <pre>mapper.queryPage(Customer.class, queryExpression)<br />mapper.queryPage(Customer.class, queryExpression, <br />                                 mapperConfig)</pre>  |  <pre>table.query(queryRequest)<br />table.query(queryConditional)</pre> Usar o `PageIterable.items()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.items.subscribe()` para respostas assíncronas  | 
|  Verificar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada **Operação do DynamoDB:** `Scan`  |  <pre>mapper.scan(Customer.class, scanExpression)<br />mapper.scan(Customer.class, scanExpression, <br />                            mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Usar o `PageIterable.stream()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.subscribe()` para respostas assíncronas  | 
|  Fazer uma varredura de uma tabela ou um índice secundário do DynamoDB e retornar uma lista **Operação do DynamoDB:** `Scan`  |  <pre>mapper.scanPage(Customer.class, scanExpression)<br />mapper.scanPage(Customer.class, scanExpression, <br />                                mapperConfig)</pre>  |  <pre>table.scan()<br />table.scan(scanRequest)</pre> Usar o `PageIterable.items()` retornado (carregamento lento) para respostas sincronizadas e `PagePublisher.items.subscribe()` para respostas assíncronas  | 
|  Ler vários itens de várias tabelas em um lote **Operação do DynamoDB:** `BatchGetItem`  |  <pre>mapper.batchLoad(Arrays.asList(customer1, <br />                               customer2, <br />                               book1))<br />mapper.batchLoad(itemsToGet) <br />           // itemsToGet: Map<Class<?>, List<KeyPair>></pre>  |  <pre>enhancedClient.batchGetItem(batchGetItemRequest)<br /><br />enhancedClient.batchGetItem(r -> r.readBatches(<br />    ReadBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build(),<br />    ReadBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addGetItem(i -> i.key(k -> k.partitionValue(0)))<br />             .build()))<br /><br />// Iterate over pages with lazy loading or over all items <br />   from the same table.</pre>  | 
|  Gravar vários itens em várias tabelas em um lote **Operação do DynamoDB:** `BatchWriteItem`  |  <pre>mapper.batchSave(Arrays.asList(customer1, <br />                               customer2, <br />                               book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(batchWriteItemRequest)<br /><br />enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addPutItem(item2)<br />             .build()))</pre>  | 
|  Excluir vários itens de várias tabelas em um lote **Operação do DynamoDB:** `BatchWriteItem`  |  <pre>mapper.batchDelete(Arrays.asList(customer1, <br />                                 customer2, <br />                                 book1)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addDeleteItem(item1key)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  Gravar/excluir vários itens em um lote **Operação do DynamoDB:** `BatchWriteItem`  |  <pre>mapper.batchWrite(Arrays.asList(customer1, book1), <br />                  Arrays.asList(customer2)) </pre>  |  <pre>enhancedClient.batchWriteItem(r -> r.writeBatches(<br />    WriteBatch.builder(Record1.class)<br />             .mappedTableResource(mappedTable1)<br />             .addPutItem(item1)<br />             .build(),<br />    WriteBatch.builder(Record2.class)<br />             .mappedTableResource(mappedTable2)<br />             .addDeleteItem(item2key)<br />             .build()))</pre>  | 
|  Fazer uma gravação transacional **Operação do DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Fazer uma leitura transacional **Operação do DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Obter uma contagem de itens correspondentes de uma consulta **Operação do DynamoDB:** `Query` com `Select.COUNT`  |  <pre>mapper.count(Customer.class, queryExpression)</pre>  |  <pre>// Get the count from query results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.query(QueryEnhancedRequest.builder()<br />        .queryConditional(queryConditional)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.query(QueryEnhancedRequest.builder()<br />                .queryConditional(queryConditional)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  Obter uma contagem de itens correspondentes de uma varredura **Operação do DynamoDB:** `Scan` com `Select.COUNT`  |  <pre>mapper.count(Customer.class, scanExpression)</pre>  |  <pre>// Get the count from scan results.<br />PageIterable<Customer> pageIterable =<br />    customerTable.scan(ScanEnhancedRequest.builder()<br />        .filterExpression(filterExpression)<br />        .select(Select.COUNT)<br />        .build());<br />Iterator<Page<Customer>> iterator = pageIterable.iterator();<br />Page<Customer> page = iterator.next();<br />int count = page.count();<br /><br />// For a more concise approach, you can chain the method calls:<br />int count = customerTable.scan(ScanEnhancedRequest.builder()<br />                .filterExpression(filterExpression)<br />                .select(Select.COUNT)<br />                .build())<br />            .iterator().next().count();</pre>  | 
|  Criar uma tabela no DynamoDB correspondente à classe POJO **Operação do DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> A declaração anterior gera uma solicitação de criação de tabela de baixo nível; os usuários devem chamar `createTable` no cliente do DynamoDB.  |  <pre>table.createTable(createTableRequest)<br /><br />table.createTable(r -> r.provisionedThroughput(defaultThroughput())<br />    .globalSecondaryIndices(<br />        EnhancedGlobalSecondaryIndex.builder()<br />            .indexName("gsi_1")<br />            .projection(p -> p.projectionType(ProjectionType.ALL))<br />            .provisionedThroughput(defaultThroughput())<br />            .build()));</pre>  | 
|  Fazer uma varredura paralela no DynamoDB **Operação do DynamoDB:** `Scan` com parâmetros `Segment` e `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Os usuários devem gerenciar as threads de operador e chamar `scan` para cada segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integrar o Amazon S3 com o DynamoDB para armazenar links inteligentes do S3  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Incompatível porque combina o Amazon S3 e o DynamoDB.  | 

## Classes e propriedades de mapa
<a name="dynamodb-mapping-schemas"></a>

Tanto na V1 quanto na V2, você mapeia classes para tabelas usando anotações no estilo bean. A V2 também [oferece outras formas de definir esquemas](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) para casos de uso específicos, como trabalhar com classes imutáveis.

### Anotações de bean
<a name="dynamodb-mapping-schemas-annos"></a>

A tabela a seguir mostra as anotações de bean equivalentes para um caso de uso específico que são usadas na V1 e na V2. Um cenário de classe `Customer` é usado para ilustrar os parâmetros.

As anotações, assim como as classes e enumerações, na V2 seguem a convenção camel case e usam '', não 'DynamoDB'. DynamoDb


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Mapear classe para tabela |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>O nome da tabela é definido ao chamar o método DynamoDbEnhancedClient\$1table(). | 
| Designar um membro da classe como um atributo da tabela  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designar um membro da classe é fundamental hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designar um membro da classe é fundamental range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designar um membro da classe é uma chave de partição/hash de índice secundário |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designar um membro da classe é uma chave de classificação/intervalo de índice secundário |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorar esse membro da classe ao mapear para uma tabela |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designar um membro da classe como um atributo de chave UUID gerado automaticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente.  | 
| Designar um membro da classe como um atributo de carimbo de data e hora gerado automaticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente.  | 
| Designar um membro da classe como um atributo de versão incrementado automaticamente |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> A extensão que fornece isso é carregada automaticamente.  | 
| Designar um membro da classe como solicitando uma conversão personalizada |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designar um membro da classe para ser armazenado como um tipo de atributo diferente |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Use uma implementação `AttributeConverter`. A V2 fornece muitos conversores incorporados para tipos de Java comuns. Você também pode implementar seu próprio `AttributeConverter` ou `AttributeConverterProvider` personalizado. Veja [Conversão de atributo de controle](ddb-en-client-adv-features-conversion.md) neste guia.  | 
| Designar uma classe que possa ser serializada em um documento do DynamoDB (documento no estilo JSON) ou subdocumento  |  <pre>@DynamoDBDocument</pre>  | Use a API de documento aprimorado. Consulte os recursos a seguir:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Anotações adicionais da V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Designar um membro da classe para não ser armazenado como um atributo NULL se o valor Java for nulo | N/D |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designar um membro da classe para ser um objeto vazio se todos os atributos forem nulos | N/D |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designar uma ação especial de atualização para um membro da classe | N/D |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designar uma classe imutável | N/D |  <pre>@DynamoDbImmutable</pre>  | 
| Designar um membro da classe como um atributo de contador incrementado automaticamente | N/D |  <pre>@DynamoDbAtomicCounter</pre> A extensão que fornece essa funcionalidade é carregada automaticamente.  | 

## Configuração
<a name="dynamodb-mapping-configuration"></a>

Na V1, você geralmente controla comportamentos específicos usando uma instância de `DynamoDBMapperConfig`. Você pode fornecer o objeto de configuração ao criar o mapeador ou ao fazer uma solicitação. Na V2, a configuração é específica para o objeto de solicitação da operação.


| Caso de uso | V1 | Padrão na V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Estratégia de load/write repetição em lote |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | fazer novas tentativas de itens com falha | Configure a estratégia de novas tentativas no DynamoDBClient subjacente. Veja [Configure o comportamento de repetição no AWS SDK for Java 2.x](retry-strategy.md) neste guia. | 
| Leituras consistentes |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Por padrão, leituras consistentes são falsas para operações de leitura. Substitua por .consistentRead(true) no objeto de solicitação. | 
| Esquema de conversão com conjuntos de marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas.  | V2\$1COMPATIBLE | Não aplicável. Esse é um recurso legado que se refere à forma como as versões mais antigas do DynamoDB (V1) armazenavam os tipos de dados, e esse comportamento não será preservado no cliente aprimorado. Um exemplo de comportamento no DynamoDB V1 é armazenar boolianos como número em vez de boolianos. | 
| Nomes das tabelas |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas  | usar anotação ou suposição da classe |  O nome da tabela é definido ao chamar o método `DynamoDbEnhancedClient#table()`.  | 
| Estratégia de carregamento de paginação |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  As opções são: LAZY\$1`LOADING`, `EAGER_LOADING` ou `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Solicitar coleta de métricas |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Use metricPublisher() em ClientOverrideConfiguration ao criar o cliente padrão do DynamoDB.  | 
| Comportamento de salvamento |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> As opções são `UPDATE`, `CLOBBER`, `PUT`, `APPEND_SET` ou `UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  Na V2, você chama `putItem()` ou `updateItem()` explicitamente. `CLOBBER or PUT`: a ação correspondente na v2 está chamando `putItem()`. Não há configuração `CLOBBER` específica. `UPDATE`: Corresponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corresponde `updateItem()` a. Controle o comportamento da atualização com a configuração da solicitação `ignoreNulls` e a anotação/tag `DynamoDbUpdateBehavior`. `APPEND_SET`: incompatível  | 
| Fábrica de conversão de tipo |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | conversores de tipo padrão |  Definir o bean usando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configuração por operação
<a name="dynamodb-mapping-configuration-per-op"></a>

Na V1, algumas operações, como `query()`, são altamente configuráveis por meio de um objeto de “expressão” enviado à operação. Por exemplo:

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

mapper.query(Customer.class, emailBwQueryExpr);
```

Na V2, em vez de usar um objeto de configuração, você define parâmetros no objeto de solicitação usando um compilador. Por exemplo:

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

customerTable.query(emailBw);
```

## Condicionais
<a name="dynamodb-mapping-conditionals"></a>

Na V2, as expressões condicionais e de filtragem são expressas usando um objeto `Expression`, que encapsula a condição e o mapeamento de nomes e filtros. 


| Caso de uso | Operações | V1 | V2 | 
| --- | --- | --- | --- | 
| Condições de atributo esperadas | save(), delete(), query(), scan() |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Obsoleto; use ConditionExpression em vez disso. | 
| Expressão de condição | delete() |  <pre>deleteExpression.setConditionExpression("zipcode = :zipcode")<br />deleteExpression.setExpressionAttributeValues(...)<br /></pre>  |  <pre>Expression conditionExpression =<br />    Expression.builder()<br />        .expression("#key = :value OR #key1 = :value1")<br />        .putExpressionName("#key", "attribute")<br />        .putExpressionName("#key1", "attribute3")<br />        .putExpressionValue(":value", AttributeValues.stringValue("wrong"))<br />        .putExpressionValue(":value1", AttributeValues.stringValue("three"))<br />        .build();<br /><br />DeleteItemEnhancedRequest request = DeleteItemEnhancedRequest.builder()<br />         .conditionExpression(conditionExpression).build();</pre>  | 
| Expressão de filtro | query(), scan() |  <pre>scanExpression<br />  .withFilterExpression("#statename = :state")<br />  .withExpressionAttributeValues(attributeValueMapBuilder.build())<br />  .withExpressionAttributeNames(attributeNameMapBuilder.build())<br /></pre>  |  <pre>Map<String, AttributeValue> values = singletonMap(":key", stringValue("value"));<br />Expression filterExpression =<br />    Expression.builder()<br />        .expression("name = :key")<br />        .expressionValues(values)<br />        .build();<br />QueryEnhancedRequest request = QueryEnhancedRequest.builder()<br />    .filterExpression(filterExpression).build();<br /></pre>  | 
| Expressão de condição para consulta | query() |  <pre>queryExpression.withKeyConditionExpression()</pre>  |  <pre>QueryConditional keyEqual = QueryConditional.keyEqualTo(b -> b<br />                .partitionValue("movie01"));<br /><br />QueryEnhancedRequest tableQuery = QueryEnhancedRequest.builder()<br />                .queryConditional(keyEqual)<br />                .build();</pre>  | 

## Conversão de tipo
<a name="dynamodb-mapping-type-conv"></a>

### Conversores padrão
<a name="dynamodb-mapping-type-conv-defaults"></a>

Na V2, o SDK fornece um conjunto de conversores padrão para todos os tipos comuns. É possível alterar os conversores de tipo tanto no nível geral do provedor quanto em um único atributo. Você pode encontrar uma lista dos conversores disponíveis na referência da [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Definir um conversor personalizado para um atributo
<a name="dynamodb-mapping-type-conv-anno"></a>

Na V1, é possível e anotar um método getter com `@DynamoDBTypeConverted` para especificar a classe que é convertida entre o tipo de atributo Java e o tipo de atributo do DynamoDB. Por exemplo, um `CurrencyFormatConverter` que converte entre um tipo Java `Currency` e uma string do DynamoDB pode ser aplicada conforme mostrado no trecho a seguir.

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

O equivalente da V2 do trecho anterior é mostrado abaixo.

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

**nota**  
Na V1, é possível aplicar a anotação ao próprio atributo, a um tipo ou a uma anotação definida pelo usuário. A V2 permite a aplicação da anotação somente ao getter.

### Adicionar uma fábrica ou fornecedor de conversor de tipo
<a name="dynamodb-mapping-type-conv-factory"></a>

Na V1, você pode fornecer seu próprio conjunto de conversores de tipo, ou substituir os tipos que forem importantes para você adicionando uma fábrica de conversores de tipo à configuração. A fábrica do conversor de tipos amplia `DynamoDBTypeConverterFactory` e as substituições são feitas obtendo uma referência ao conjunto padrão e ampliando-o. O trecho a seguir demonstra como fazer isso.

```
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);
```

A V2 fornece funcionalidade semelhante por meio da anotação `@DynamoDbBean`. Você pode fornecer um único `AttributeConverterProvider` ou uma cadeia de `AttributeConverterProvider`s ordenados. Observe que, se fornecer sua própria cadeia de provedores de conversão de atributos, você substituirá o provedor de conversão padrão, e deve incluí-lo na cadeia para usar os conversores de atributos. 

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

A seção sobre [conversão de atributos](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) neste guia contém um exemplo completo para a V2.

# Diferenças de gerenciamento de strings entre a versão 1 e a versão 2 do SDK para Java
<a name="dynamodb-migration-string-handling"></a>

A V1 e a V2 gerenciam strings vazias de forma diferente ao enviar dados para o DynamoDB:
+ **V1**: converte strings vazias em valores nulos antes de enviar para o DynamoDB (resultando em nenhum atributo)
+ **V2**: envia strings vazias como valores reais de string vazias para o DynamoDB

**Importante**  
Depois de migrar para a V2, se você não quiser que strings vazias sejam armazenadas no DynamoDB, implemente conversores personalizados. Sem conversores personalizados, a V2 armazena strings vazias como atributos reais de string vazias nos itens do DynamoDB, o que difere do comportamento da V1 de omitir totalmente esses atributos.

**Example conversor personalizado para V2 que converte um atributo de string vazia em nulo**  

```
/**
 * Custom converter that maintains V1 behavior by converting empty strings to null values
 * when writing to DynamoDB, ensuring compatibility with existing data. No attribute will be saved to DynamoDB.
 */
public class NullifyEmptyStringConverter implements AttributeConverter<String> {
    @Override
    public AttributeValue transformFrom(String value) {
        if (value == null || value.isEmpty()) {
            return AttributeValue.builder().nul(true).build();
        }
        return AttributeValue.builder().s(value).build();
    }

    @Override
    public String transformTo(AttributeValue attributeValue) {
        if (attributeValue.nul()) {
            return null;
        }
        return attributeValue.s();
    }

    @Override
    public EnhancedType<String> type() {
        return EnhancedType.of(String.class);
    }

    @Override
    public AttributeValueType attributeValueType() {
        return AttributeValueType.S;
    }
}

// V2 usage:
@DynamoDbBean
public class Customer {
    private String name;

    @DynamoDbConvertedBy(NullifyEmptyStringConverter.class)
    public String getName() {
        return name;
    }
}
```



# Diferenças de bloqueio positivo entre a versão 1 e a versão 2 do SDK para Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Tanto a V1 quanto a V2 implementam um bloqueio positivo com uma anotação de atributo que marca uma propriedade em sua classe de bean para armazenar o número da versão.


**Diferenças no comportamento de bloqueio positivo**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Anotação da classe de bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute (observe que V2 usa um “b” minúsculo) | 
| Salvamento inicial | Atributo do número da versão definido como 1. |  O valor inicial para o atributo de versão definido com `@DynamoDbVersionAttribute(startAt = X)`. O valor padrão é 0.  | 
| Atualizar | O atributo do número da versão será incrementado em 1 se a verificação condicional confirmar que o número da versão do objeto que está sendo atualizado corresponde ao número no banco de dados. |  O atributo do número da versão será incrementado se a verificação condicional confirmar que o número da versão do objeto que está sendo atualizado corresponde ao número no banco de dados. O atributo do número da versão incrementado pela opção `incrementBy` definida com `@DynamoDbVersionAttribute(incrementBy = X)`. O valor padrão é 1.  | 
| Delete | DynamoDBMapper adiciona uma verificação condicional de que o número da versão do objeto que está sendo excluído corresponde ao número da versão no banco de dados. |  A V2 não adiciona automaticamente condições para as operações de exclusão. Você deverá adicionar expressões condicionais manualmente se quiser controlar o comportamento de exclusão. No exemplo a seguir, `recordVersion` é o atributo da versão do bean. <pre>// 1. Read the item and get its current version.<br />Customer item = customerTable.getItem(Key.builder().partitionValue("someId").build());<br />AttributeValue currentVersion = item.getRecordVersion();<br /><br />// 2. Create conditional delete with the `currentVersion` value.<br />DeleteItemEnhancedRequest deleteItemRequest =<br />    DeleteItemEnhancedRequest.builder()<br />       .key(KEY)<br />       .conditionExpression(Expression.builder()<br />           .expression("recordVersion = :current_version_value")<br />           .putExpressionValue(":current_version_value", currentVersion)<br />           .build()).build();<br /><br />customerTable.deleteItem(deleteItemRequest);</pre>  | 
| Gravação transacional com verificação de condição | Você não pode usar uma classe de bean que esteja anotada com @DynamoDBVersionAttribute em um método addConditionCheck. | Você pode usar uma classe de bean com a anotação @DynamoDbVersionAttribute em um método de compilador addConditionCheck para uma solicitação transactWriteItems. | 
| Disable (Desabilitar) | Desabilite o bloqueio positivo alterando o valor da enumeração  DynamoDBMapperConfig.SaveBehavior de UPDATE para CLOBBER. |  Não use a anotação `@DynamoDbVersionAttribute`.  | 

# Diferenças de setters fluentes entre a versão 1 e a versão 2 do SDK para Java
<a name="dynamodb-migrate-fluent-setters"></a>

Você pode usar POJOs com configuradores fluentes na API de mapeamento do DynamoDB para V1 e com V2 desde a versão 2.30.29. 

Por exemplo, o POJO a seguir retorna uma instância `Customer` do método `setName`:

```
// V1

@DynamoDBTable(tableName ="Customer")
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){
     this.name = name;
     return this;
  }
}
```

No entanto, se você usar uma versão da V2 anterior à 2.30.29, `setName` retornará uma instância `Customer` com um valor `name` de `null`.

```
// V2 prior to version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Bug: returns this instance with a `name` value of `null`.
  }
}
```

```
// Available in V2 since version 2.30.29.

@DynamoDbBean
public class Customer{
  private String name;
  // Other attributes and methods not shown.
  public Customer setName(String name){ 
     this.name = name;
     return this;  // Returns this instance for method chaining with the `name` value set.
  }
}
```

# Documente as diferenças da API entre a versão 1 e a versão 2 do AWS SDK para Java
<a name="dynamodb-mapping-document-api"></a>

A API de documentos é compatível com o trabalho com documentos no estilo JSON como itens únicos em uma tabela do DynamoDB. A API de documentos da V1 tem uma API correspondente na V2, mas em vez de usar um cliente separado para a API de documentos, como na V1, a V2 incorpora recursos dessa API no cliente aprimorado do DynamoDB. 

Na V1, a classe [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Item.html) representa um registro não estruturado de uma tabela do DynamoDB. Na V2, um registro não estruturado é representado por uma instância da classe [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html). Observe que as chaves primárias são definidas no esquema da tabela para a V2 e no próprio item na V1.

A tabela abaixo compara as diferenças entre o documento na V1 e APIs na V2.


| Caso de uso | V1 | V2 | 
| --- |--- |--- |
| Crie um cliente de documentos |  <pre>AmazonDynamoDB client = ... //Create a client.<br />DynamoDB documentClient = new DynamoDB(client);</pre>  |  <pre>// The V2 Document API uses the same DynamoDbEnhancedClient<br />// that is used for mapping POJOs.<br />DynamoDbClient standardClient = ... //Create a standard client.<br />DynamoDbEnhancedClient enhancedClient = ... // Create an enhanced client.<br /></pre>  | 
| Faça referência a uma tabela |  <pre>Table documentTable = docClient.documentClient("Person");</pre>  |  <pre>DynamoDbTable<EnhancedDocument> documentTable = enhancedClient.table("Person",  <br />        TableSchema.documentSchemaBuilder()<br />              .addIndexPartitionKey(TableMetadata.primaryIndexName(),"id", AttributeValueType.S)<br />              .attributeConverterProviders(AttributeConverterProvider.defaultProvider())<br />              .build());</pre>  | 
| **Work with semi-structured data** | 
| --- |
| Colocar item |  <pre>Item item = new Item()<br />      .withPrimaryKey("id", 50)<br />      .withString("firstName", "Shirley");<br />PutItemOutcome outcome = documentTable.putItem(item);</pre>  |  <pre>EnhancedDocument personDocument = EnhancedDocument.builder()<br />        .putNumber("id", 50)<br />        .putString("firstName", "Shirley")<br />        .build();<br />documentTable.putItem(personDocument);</pre>  | 
| Obter item |  <pre>GetItemOutcome outcome = documentTable.getItemOutcome( "id", 50);<br />Item personDocFromDb = outcome.getItem();<br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  |  <pre>EnhancedDocument personDocFromDb = documentTable<br />        .getItem(Key.builder()<br />            .partitionValue(50)<br />            .build()); <br />String firstName = personDocFromDb.getString("firstName");<br /></pre>  | 
| **Work with JSON items** | 
| --- |
| Converter uma estrutura JSON para usá-la com a API Document |  <pre>// The 'jsonPerson' identifier is a JSON string. <br />Item item = new Item().fromJSON(jsonPerson);</pre>  |  <pre>// The 'jsonPerson' identifier is a JSON string.<br />EnhancedDocument document = EnhancedDocument.builder()<br />        .json(jsonPerson).build());</pre>  | 
| Coloque JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Leia JSON |  <pre>GetItemOutcome outcome = //Get item.<br />String jsonPerson = outcome.getItem().toJSON();</pre>  |  <pre>String jsonPerson = documentTable.getItem(Key.builder()<br />        .partitionValue(50).build())<br />        .fromJson();</pre>  | 

## Referência de API e guias para documentos APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Referência de API | [Referência de API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Referência de API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Guia de documentação | [Guia do desenvolvedor do Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [API de documentos aprimorados](ddb-en-client-doc-api.md) (este guia) | 

# API Xpec da V1 para API de expressões da V2
<a name="ddb-v1-xspec-migrate"></a>

A API de especificação de expressão (Xspec) disponível na V1, que ajuda a criar expressões para trabalhar com dados orientados a documentos, não está disponível na V2. A V2 usa a API Expression, que funciona com dados orientados a documentos e object-to-item dados mapeados.


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nome da API | API de especificação de expressão (Xspec) | API de expressão | 
| Funciona com | Métodos da classe [Table](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) da API de documentos, como [updateItem](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#updateItem-java.lang.String-java.lang.Object-com.amazonaws.services.dynamodbv2.xspec.UpdateItemExpressionSpec-) e [scan](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html#scan-com.amazonaws.services.dynamodbv2.xspec.ScanExpressionSpec-) |  Ambos APIs do DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Para os dois tipos de APIs, depois de adquirir uma [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/DynamoDbTable.html)instância: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) você usa expressões em métodos `DynamoDbTable` ao criar objetos de solicitação. Por exemplo, no método `filterExpression` do [https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/model/QueryEnhancedRequest.Builder.html)  | 
| Recursos |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Informações sobre expressões](ddb-en-client-expressions.md) neste Guia do desenvolvedor do Java | 

# Migração da biblioteca de criptografia
<a name="ddb-encryption-lib-migrate"></a>

Consulte informações sobre a migração da biblioteca de criptografia do DynamoDB para trabalhar com a V2 do Java SDK no [Guia do desenvolvedor do Amazon DynamoDB Encryption Client](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).