

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cambios en el trabajo con DynamoDB de la versión 1 a la versión 2 del AWS SDK para Java
<a name="migration-ddb-mapper"></a>



**Topics**
+ [Diferencias de la API de mapeo de DynamoDB entre la versión 1 y la versión 2 del AWS SDK para Java](ddb-mapping.md)
+ [Documente las diferencias de API entre la versión 1 y la versión 2 de AWS SDK para Java](dynamodb-mapping-document-api.md)
+ [Migración de la biblioteca de cifrado](ddb-encryption-lib-migrate.md)

# Diferencias de la API de mapeo de DynamoDB entre la versión 1 y la versión 2 del AWS SDK para Java
<a name="ddb-mapping"></a>

El APIs mapeo de DynamoDB cambió significativamente entre la versión 1 y la versión 2 de. AWS SDK para Java En la versión 1, se utiliza `DynamoDBMapper` para trabajar con Java. POJOs En la versión 2, se utiliza `DynamoDbEnhancedClient` con nombres de métodos actualizados, opciones de definición de esquemas mejoradas y seguridad de tipos mejorada.

Principales diferencias:
+ Nuevos nombres de métodos (por ejemplo, `getItem` en lugar de `load`)
+ Creación de esquemas de tabla explícitos
+ Compatibilidad integrada con operaciones sincrónicas y asincrónicas
+ Cambios en la forma en que se administran las cadenas vacías y la configuración

En esta sección, se describen los cambios en la API de asignación, las diferencias en las anotaciones, las actualizaciones de configuración y la guía de migración para ayudarte a realizar la transición de `DynamoDBMapper` v1 a `DynamoDbEnhancedClient` v2.

**Contents**
+ [Cambios de alto nivel en las bibliotecas asignación de la versión 1 a la 2 del SDK para Java](dynamodb-mapping-high-level.md)
  + [Diferencias en dependencia de importación](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Cambios en el APIs mapeo de DynamoDB entre la versión 1 y la versión 2 del SDK for Java](dynamodb-mapping-api-changes.md)
  + [Crear un cliente](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Establecimiento de asignación a tabla/índice de DynamoDB](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Operaciones de tabla](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Asignación de clases y propiedades](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Anotaciones de bean](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [Anotaciones adicionales de la V2](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Configuración](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Configuración por operación](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Condicionales](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Conversión de tipos](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Convertidores predeterminados](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Establecimiento de un conversor personalizado para un atributo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Adición de una fábrica o un proveedor de convertidores de tipos](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [Diferencias en el tratamiento de cadenas entre la versión 1 y la 2 del SDK para Java](dynamodb-migration-string-handling.md)
+ [Diferencias de bloqueo positivo entre la versión 1 y la 2 del SDK para Java](dynamodb-migrate-optimstic-locking.md)
+ [Fluent setters: diferencias entre la versión 1 y la 2 del SDK para Java](dynamodb-migrate-fluent-setters.md)

# Cambios de alto nivel en las bibliotecas asignación de la versión 1 a la 2 del SDK para Java
<a name="dynamodb-mapping-high-level"></a>

Los nombres del cliente de asignación de cada biblioteca difieren en la V1 y en la V2:
+ V1: Dynamo DBMapper
+ V2: Cliente mejorado de DynamoDB

Se interactúa con las dos bibliotecas prácticamente de la misma manera: se crea una instancia mapper/client y, a continuación, se proporciona un POJO de Java para leer y escribir estos APIs elementos en las tablas de DynamoDB. Ambas bibliotecas también ofrecen anotaciones para la clase del POJO para indicar la forma en que el cliente gestiona el POJO. 

Diferencias notables al pasar a V2:
+ V2 y V1 utilizan nombres de métodos diferentes para las operaciones de DynamoDB de bajo nivel. Por ejemplo:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ La versión 2 ofrece varias formas de definir esquemas de tablas y asignarlos a tablas. POJOs Puede elegir entre el uso de anotaciones o un esquema generado a partir de código mediante un generador. V2 también ofrece versiones mutables e inmutables de los esquemas.
+ Con V2, se crea específicamente el esquema de tabla como uno de los primeros pasos, mientras que en V1, el esquema de tabla se deduce de la clase anotada según sea necesario.
+ V2 incluye el [Cliente de la API de documento](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) en la API de cliente mejorada, mientras que V1 usa una [API aparte](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html).
+ Todas APIs están disponibles en versiones síncronas y asíncronas en la versión 2.

Consulte la [sección de asignación de DynamoDB](dynamodb-enhanced-client.md) de esta guía para obtener información más detallada sobre el cliente mejorado de V2.

## Diferencias en dependencia de importación
<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 [Última versión](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

En la versión 1, una sola dependencia incluye tanto la API de DynamoDB de bajo nivel como mapping/document la API, mientras que en la versión 2, se utiliza `dynamodb-enhanced` la dependencia de artefactos para acceder a la API. mapping/document El módulo `dynamodb-enhanced` contiene una dependencia transitiva del módulo `dynamodb` de bajo nivel. 

# Cambios en el APIs mapeo de DynamoDB entre la versión 1 y la versión 2 del SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

## Crear un cliente
<a name="dynamodb-mapping-api-changes-client"></a>


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Instanciación 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>  | 
|   Instanciación mínima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Con transformador de atributos\$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>  | 

\$1Las extensiones de V2 corresponden aproximadamente a los transformadores de atributos de V1. La sección [Uso de extensiones para personalizar operaciones de DynamoDB Enhanced Client](ddb-en-client-extensions.md) contiene más información sobre extensiones de V2. 

## Establecimiento de asignación a tabla/índice de DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

En V1, se especifica un nombre de tabla de DynamoDB mediante una anotación de bean. En V2, un método de fábrica, `table()`, produce una instancia de `DynamoDbTable` que representa la tabla remota de DynamoDB. El primer parámetro del método `table()` es el nombre de tabla de DynamoDB.


****  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|   Asignar la clase POJO de Java a la tabla de 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>  | 
|   Asignar a un índice secundario de DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) En la sección de la Guía para desarrolladores de DynamoDB que analiza [el método de `query` V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) se muestra un ejemplo completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) En la sección [Usar índices secundarios](ddb-en-client-use-secindex.md) de esta guía se proporciona más información.  | 

## Operaciones de tabla
<a name="dynamodb-mapping-api-changes-tobleops"></a>

En esta sección se describen las operaciones APIs que difieren entre la V1 y la V2 en la mayoría de los casos de uso estándar. 

En la V2, todas las operaciones que implican una sola tabla se llaman en la instancia de `DynamoDbTable`, no en el cliente mejorado. El cliente mejorado contiene métodos que pueden referirse a varias tablas. 

En la tabla denominada *Operaciones de tabla* que aparece a continuación, se hace referencia a una instancia de POJO como `item` o como tipo específico, por ejemplo `customer1`. En los ejemplos de la V2, la instancia llamada `table` es resultado de una llamada anterior a `enhancedClient.table()` que devuelve una referencia a la instancia `DynamoDbTable`.

Tenga en cuenta que la mayoría de las operaciones de la V2 se pueden llamar con un patrón de consumo fluido, incluso cuando no se muestran. Por ejemplo:

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

Para las operaciones de la V1, *Operaciones de tabla* (a continuación) contiene algunos de los formularios más utilizados y no todos los formularios sobrecargados. Por ejemplo, el método `load()` presenta las siguientes 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)
```

*Operaciones de tabla* (a continuación) muestra los formularios más utilizados:

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


**Operaciones de tabla**  

| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
|  Escribir un POJO de Java en una tabla de DynamoDB **Operación de DynamoDB**: `PutItem`, `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> En la V1, `DynamoDBMapperConfig.SaveBehavior` y las anotaciones determinan a qué método de DynamoDB de bajo nivel se llamará. En general, se llama a `UpdateItem` excepto cuando se usa `SaveBehavior.CLOBBER` y `SaveBehavior.PUT`. Las claves generadas automáticamente son un caso de uso especial y, en ocasiones, se utilizan `PutItem` y `UpdateItem`.  |  <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>  | 
|  Leer un elemento de una tabla de DynamoDB a un POJO de Java **Operación de 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>  | 
|  Eliminar un elemento de una tabla de DynamoDB **Operación de DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Consultar una tabla o un índice secundario de DynamoDB y devolución de una lista paginada **Operación de 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 el `PageIterable.stream()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.subscribe()` para respuestas asincrónicas  | 
|  Consultar una tabla o un índice secundario de DynamoDB y devolver una lista **Operación de 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 el `PageIterable.items()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.items.subscribe()` para respuestas asincrónicas  | 
|  Analizar una tabla o un índice secundario de DynamoDB y devolver una lista paginada **Operación de 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 el `PageIterable.stream()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.subscribe()` para respuestas asincrónicas  | 
|  Analizar una tabla o un índice secundario de DynamoDB y devolver una lista **Operación de 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 el `PageIterable.items()` devuelto (carga diferida) para respuestas sincrónicas y `PagePublisher.items.subscribe()` para respuestas asincrónicas  | 
|  Leer varios elementos de varias tablas de un lote **Operación de 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>  | 
|  Escribir varios elementos en varias tablas de un lote **Operación de 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>  | 
|  Eliminar varios elementos de varias tablas de un lote **Operación de 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>  | 
|  Escribir/eliminar varios elementos de un lote **Operación de 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>  | 
|  Realizar una escritura transaccional **Operación de DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Realizar una lectura transaccional **Operación de DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Obtener un recuento de elementos coincidentes de una consulta **Operación de DynamoDB:** `Query` con `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>  | 
|  Obtener un recuento de elementos coincidentes de un análisis **Operación de DynamoDB:** `Scan` con `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>  | 
|  Crear una tabla en DynamoDB correspondiente a la clase POJO **Operación de DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> La instrucción anterior genera una solicitud de creación de tabla de bajo nivel; los usuarios deben llamar a `createTable` en el cliente de 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>  | 
|  Realizar un análisis paralelo en DynamoDB **Operación de DynamoDB**: `Scan` con parámetros`Segment` y `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Los usuarios deben administrar los subprocesos de trabajo y llamar a `scan` para cada segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integración de Amazon S3 con DynamoDB para almacenar enlaces de S3 inteligentes  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  No se admite porque acopla Amazon S3 y DynamoDB.  | 

## Asignación de clases y propiedades
<a name="dynamodb-mapping-schemas"></a>

Tanto en la V1 como en la V2, las clases se asignan a tablas mediante anotaciones de tipo bean. La V2 también ofrece [otras formas de definir esquemas](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) para casos de uso específicos, como trabajar con clases inmutables.

### Anotaciones de bean
<a name="dynamodb-mapping-schemas-annos"></a>

La siguiente tabla muestra las anotaciones de bean equivalentes para un caso de uso específico que se utilizan en V1 y V2. Se utiliza un escenario de clase de `Customer` para ilustrar parámetros.

Las anotaciones, así como las clases y las enumeraciones, de la versión 2 siguen la convención camel case y utilizan '', no 'DynamoDB'. DynamoDb


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Asignar clase a tabla |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>El nombre de la tabla se define al llamar al método DynamoDbEnhancedClient\$1table(). | 
| Designar un miembro de clase como atributo de tabla  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designar a un hash/partition miembro de la clase es clave |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designar a un miembro de la clase es range/sort clave |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designar un miembro de clase como clave de hash/partición de índice secundario |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designar un miembro de clase como clave de rango/clasificación de índice secundario |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignorar este miembro de clase al asignarlo a una tabla |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designar un miembro de clase como atributo clave UUID generado automáticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al compilador de clientes.  | 
| Designar un miembro de clase como atributo de marca de tiempo generado automáticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al compilador de clientes.  | 
| Designar un miembro de clase como atributo de versión con incremento automático |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> La extensión que proporciona esto se carga automáticamente.  | 
| Designar que un miembro de clase requiere una conversión personalizada |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designar que un miembro de clase se almacene como otro tipo de atributo |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Utilice una implementación de `AttributeConverter`. V2 proporciona muchos convertidores integrados para tipos de Java comunes. También puede implementar su propio `AttributeConverter` o `AttributeConverterProvider` personalizado. Consulte [Conversión de atributos de control](ddb-en-client-adv-features-conversion.md) en esta guía.  | 
| Designe una clase que se pueda serializar en un documento (documento de estilo JSON) o subdocumento de DynamoDB  |  <pre>@DynamoDBDocument</pre>  | Uso de la API de Documento mejorado Consulte los siguientes recursos:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Anotaciones adicionales de la V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso de uso | V1 | V2 | 
| --- | --- | --- | 
| Designar que un miembro de clase no se almacene como atributo NULL si el valor de Java es nulo | N/A |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designar un miembro de clase como objeto vacío si todos los atributos son nulos | N/A |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designar una acción de actualización especial para un miembro de clase | N/A |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designar una clase inmutable | N/A |  <pre>@DynamoDbImmutable</pre>  | 
| Designar un miembro de clase como atributo de contador de incremento automático | N/A |  <pre>@DynamoDbAtomicCounter</pre> La extensión que proporciona esto se carga automáticamente.  | 

## Configuración
<a name="dynamodb-mapping-configuration"></a>

En la V1, generalmente se controlan comportamientos específicos mediante una instancia de `DynamoDBMapperConfig`. Puede proporcionar el objeto de configuración al crear el asignador o al realizar una solicitud. En la V2, la configuración es específica del objeto de solicitud de la operación.


| Caso de uso | V1 | Predeterminado en V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Estrategia de load/write reintento por lotes |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | reintento de elementos fallidos | Configure la estrategia de reintento en el DynamoDBClient subyacente. Consulte [Configure el comportamiento de reintento en el AWS SDK for Java 2.x](retry-strategy.md) en esta guía. | 
| Lecturas consistentes |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | De forma predeterminada, las lecturas consistentes son falsas para operaciones de lectura. Anule con .consistentRead(true) en el objeto de solicitud. | 
| Esquema de conversión con conjuntos de serializadores/deserializadores |  <pre>  .withConversionSchema(conversionSchema)</pre> Las implementaciones estáticas proporcionan compatibilidad con versiones anteriores.  | V2\$1COMPATIBLE | No se usa. Se trata de una función antigua que hace referencia a la forma en que las primeras versiones de DynamoDB (V1) almacenaban los tipos de datos, y este comportamiento no se conservará en el cliente mejorado. Un ejemplo de comportamiento en DynamoDB V1 es almacenar los valores booleanos como número en lugar de como booleanos. | 
| Nombres de tablas |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Las implementaciones estáticas proporcionan compatibilidad con versiones anteriores  | usa anotación o estimación a partir de la clase |  El nombre de la tabla se define al llamar al método `DynamoDbEnhancedClient#table()`.  | 
| Estrategia de carga de paginación |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Las opciones son: LAZY\$1, `LOADING`, `EAGER_LOADING` o `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Solicitud de recopilación de métricas |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Use metricPublisher() en ClientOverrideConfiguration al crear el cliente estándar de DynamoDB.  | 
| Comportamiento de guardado |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Las opciones son `UPDATE`, `CLOBBER`, `PUT`, `APPEND_SET` o `UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  En la V2, se llama a `putItem()` o `updateItem()` de forma explícita. `CLOBBER or PUT`: la acción correspondiente en la v2 es llamar a `putItem()`. No hay una configuración específica de `CLOBBER`. `UPDATE`: Corresponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corresponde a`updateItem()`. Controle el comportamiento de actualización con la configuración de solicitud `ignoreNulls` y la anotación/etiqueta `DynamoDbUpdateBehavior`. `APPEND_SET`: no se admite  | 
| Fábrica de convertidores de tipos |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | convertidores de tipos estándar |  Establezca el bean utilizando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configuración por operación
<a name="dynamodb-mapping-configuration-per-op"></a>

En la V1, algunas operaciones, por ejemplo, `query()`, son altamente configurables mediante un objeto de “expresión” enviado a la operación. Por ejemplo:

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

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

En la V2, en lugar de utilizar un objeto de configuración, se establecen parámetros en el objeto de solicitud mediante un generador. Por ejemplo:

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

customerTable.query(emailBw);
```

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

En la V2, las expresiones condicionales y de filtrado se expresan mediante un objeto `Expression`, que encapsula la condición y la asignación de nombres y filtros. 


| Caso de uso | Operaciones | V1 | V2 | 
| --- | --- | --- | --- | 
| Condiciones 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; utilice ConditionExpression en su lugar. | 
| Expresión de condición | 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>  | 
| Expresión 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>  | 
| Expresión de condición 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>  | 

## Conversión de tipos
<a name="dynamodb-mapping-type-conv"></a>

### Convertidores predeterminados
<a name="dynamodb-mapping-type-conv-defaults"></a>

En la V2, el SDK proporciona un conjunto de convertidores predeterminados para todos los tipos comunes. Puede cambiar los convertidores de tipos tanto en el nivel de proveedor general como para un único atributo. Puedes encontrar una lista de los convertidores disponibles en la referencia de la [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Establecimiento de un conversor personalizado para un atributo
<a name="dynamodb-mapping-type-conv-anno"></a>

En la V1, puede anotar un método getter con `@DynamoDBTypeConverted` para especificar la clase que convierte entre el tipo de atributo de Java y un tipo de atributo de DynamoDB. Por ejemplo, se puede aplicar un `CurrencyFormatConverter` que convierta entre un tipo `Currency` de Java y una cadena de DynamoDB, como se muestra en el siguiente fragmento de código.

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

A continuación se muestra el equivalente en V2 del fragmento anterior.

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

**nota**  
En la V1 puede aplicar la anotación al atributo en sí, a un tipo o a una anotación definida por el usuario, mientras que en la V2 solo se puede aplicar la anotación al getter.

### Adición de una fábrica o un proveedor de convertidores de tipos
<a name="dynamodb-mapping-type-conv-factory"></a>

En la V1 puede proporcionar su propio conjunto de convertidores de tipos o anular los tipos que le interesen añadiendo una fábrica de convertidores de tipos a la configuración. La fábrica de convertidores de tipos amplía `DynamoDBTypeConverterFactory` y las anulaciones se realizan tomando una referencia al conjunto predeterminado y ampliándola. En el siguiente fragmento de código se muestra cómo hacerlo.

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

La V2 proporciona una funcionalidad similar a través de la anotación `@DynamoDbBean`. Puede proporcionar un `AttributeConverterProvider` único o una cadena de `AttributeConverterProvider` en orden. Tenga en cuenta que si suministra su propia cadena de proveedores de convertidores de atributos, anulará el proveedor de convertidores predeterminado y deberá incluirlo en la cadena para utilizar sus convertidores de atributos. 

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

La sección sobre [conversión de atributos](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) de esta guía contiene un ejemplo completo para la V2.

# Diferencias en el tratamiento de cadenas entre la versión 1 y la 2 del SDK para Java
<a name="dynamodb-migration-string-handling"></a>

La V1 y la V2 tratan las cadenas vacías de forma diferente al enviar datos a DynamoDB:
+ **V1**: convierte las cadenas vacías en valores nulos antes de enviarlas a DynamoDB (lo que no produce ningún atributo)
+ **V2**: envía cadenas vacías como valores reales de cadenas vacías a DynamoDB

**importante**  
Tras migrar a la V2, si no desea almacenar cadenas vacías en DynamoDB, debe implementar convertidores personalizados. Sin convertidores personalizados, la V2 almacena cadenas vacías como atributos de cadenas vacías reales en los elementos de DynamoDB, lo que difiere del comportamiento de la V1, que omite estos atributos por completo.

**Example conversor personalizado para la V2 que convierte un atributo de cadena vacía en 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;
    }
}
```



# Diferencias de bloqueo positivo entre la versión 1 y la 2 del SDK para Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Tanto la V1 como la V2 implementan bloqueo positivo con una anotación de atributo que marca una propiedad en la clase bean para almacenar el número de versión.


**Diferencias en el comportamiento de bloqueo positivo**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Anotación de clase bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute (tenga en cuenta que la V2 usa una “b” minúscula) | 
| Guardado inicial | Atributo de número de versión establecido en 1. |  Valor inicial del atributo de versión establecido en `@DynamoDbVersionAttribute(startAt = X)`. El valor predeterminado es 0.  | 
| Actualización | El atributo de número de versión se incrementa en 1 si la comprobación condicional verifica que el número de versión del objeto que se está actualizando coincide con el número de la base de datos. |  El atributo de número de versión se incrementa si la comprobación condicional verifica que el número de versión del objeto que se está actualizando coincide con el número de la base de datos. El atributo de número de versión se incrementa mediante la opción `incrementBy` establecida en `@DynamoDbVersionAttribute(incrementBy = X)`. El valor predeterminado es 1.  | 
| Eliminar | DynamoDBMapper añade una comprobación condicional de que el número de versión del objeto que se está eliminando coincide con el número de versión de la base de datos. |  La V2 no añade automáticamente condiciones para las operaciones de eliminación. Debe añadir expresiones de condición manualmente si desea controlar el comportamiento de eliminación. En el siguiente ejemplo, `recordVersion` es el atributo de versión del 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>  | 
| Escritura transaccional con comprobación de condición | No se puede utilizar una clase de bean que esté anotada con @DynamoDBVersionAttribute en un método addConditionCheck. | Puede utilizar una clase de bean con la anotación @DynamoDbVersionAttribute en un método de compilador addConditionCheck para una solicitud transactWriteItems. | 
| Deshabilitado | Para deshabilitar el bloqueo positivo, cambie el valor de enumeración  DynamoDBMapperConfig.SaveBehavior de UPDATE a CLOBBER. |  No utilice la anotación `@DynamoDbVersionAttribute`.  | 

# Fluent setters: diferencias entre la versión 1 y la 2 del SDK para Java
<a name="dynamodb-migrate-fluent-setters"></a>

Se puede usar POJOs con configuradores fluidos en la API de mapeo de DynamoDB para la versión 1 y con la V2 desde la versión 2.30.29. 

Por ejemplo, el siguiente POJO devuelve una instancia `Customer` del 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;
  }
}
```

Sin embargo, si utiliza una versión de V2 anterior a la 2.30.29, `setName` devuelve una instancia `Customer` con un 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 las diferencias de API entre la versión 1 y la versión 2 de AWS SDK para Java
<a name="dynamodb-mapping-document-api"></a>

La API de documentos permite trabajar con documentos de estilo JSON como elementos individuales en una tabla de DynamoDB. La API de documentos de la V1 tiene una API correspondiente en la V2, pero en lugar de utilizar un cliente independiente para la API de documentos como en la V1, la V2 incorpora características de la API de documentos en el cliente mejorado de DynamoDB. 

En la V1, la clase [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 un registro no estructurado de una tabla de DynamoDB. En la V2, un registro no estructurado se representa mediante una instancia de la clase [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). Tenga en cuenta que las claves principales se definen en el esquema de tabla en la V2 y en el propio elemento en la V1.

En la siguiente tabla se comparan las diferencias entre el documento APIs en la V1 y la V2.


| Caso de uso | V1 | V2 | 
| --- |--- |--- |
| Cree un 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>  | 
| Haga referencia a una tabla |  <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** | 
| --- |
| Poner elemento |  <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>  | 
| Obtener elemento |  <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** | 
| --- |
| Convierte una estructura JSON para usarla con la API de documentos |  <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>  | 
| Pon JSON |  <pre>documentTable.putItem(item)</pre>  |  <pre>documentTable.putItem(document);</pre>  | 
| Lee 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>  | 

## Referencia de API y guías para el documento APIs
<a name="dynamodb-mapping-document-api-ref"></a>


|  | V1 | V2 | 
| --- | --- | --- | 
| Referencia de la API | [Referencia de la API](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/package-summary.html) | [Referencia de la API](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/package-summary.html) | 
| Guía de documentación | [Guía para desarrolladores de Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIItemCRUD.html) | [API de documentos mejorada](ddb-en-client-doc-api.md) (esta guía) | 

# De la API Xpec de la V1 a la API Expresiones de la V2
<a name="ddb-v1-xspec-migrate"></a>

La API de especificación de expresiones (Xspec) disponible en la V1, que ayuda a crear expresiones para trabajar con datos orientados a documentos, no está disponible en la V2. La versión 2 usa la API Expression, que funciona tanto con datos orientados a documentos como con datos object-to-item mapeados.


****  

|  | V1 | V2 | 
| --- | --- | --- | 
| Nombre de API | API de especificación de expresiones (Xspec) | API de expresiones | 
| Funciona con | Métodos de la clase [Tabla](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/Table.html) de la API 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-) y [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 de DynamoDB Enhanced Client: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) Para ambos tipos de APIs, después de haber adquirido una [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)instancia: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html) utilice expresiones en métodos `DynamoDbTable` cuando cree objetos de solicitud. Por ejemplo, en el método `filterExpression` del [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/es_es/sdk-for-java/latest/developer-guide/ddb-v1-xspec-migrate.html)  | [Información sobre expresiones](ddb-en-client-expressions.md) en esta Guía para desarrolladores de Java | 

# Migración de la biblioteca de cifrado
<a name="ddb-encryption-lib-migrate"></a>

Para obtener información sobre la migración de la biblioteca de cifrado para que DynamoDB funcione con la versión 2 del SDK de Java, consulte la [Guía para desarrolladores de Cliente de encriptación de Amazon DynamoDB](https://docs.aws.amazon.com/database-encryption-sdk/latest/devguide/ddb-java-migrate.html).