

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Differenze delle API di mappatura DynamoDB tra la versione 1 e la versione 2 di AWS SDK per Java
<a name="ddb-mapping"></a>

La APIs mappatura di DynamoDB è cambiata in modo significativo tra la versione 1 e la versione 2 di. AWS SDK per Java Nella versione 1, si utilizza `DynamoDBMapper` per lavorare con Java. POJOs Nella versione 2, si utilizza `DynamoDbEnhancedClient` con nomi dei metodi aggiornati, opzioni di definizione dello schema avanzate e una maggiore sicurezza dei tipi.

Le differenze principali includono:
+ Nuovi nomi dei metodi (ad esempio, `getItem` invece di`load`)
+ Creazione esplicita dello schema di tabella
+ Supporto integrato per operazioni sincrone e asincrone
+ Modifiche nella modalità di gestione delle stringhe e della configurazione vuote

Questa sezione descrive le modifiche all'API di mappatura, le differenze nelle annotazioni, gli aggiornamenti di configurazione e le linee guida alla migrazione per aiutarti nella transizione dalla v1 alla `DynamoDBMapper` v2. `DynamoDbEnhancedClient`

**Contents**
+ [Modifiche di alto livello nelle librerie di mappatura dalla versione 1 alla versione 2 dell'SDK for Java](dynamodb-mapping-high-level.md)
  + [Importa le differenze di dipendenza](dynamodb-mapping-high-level.md#dynamodb-mapping-deps)
+ [Modifiche nella APIs mappatura di DynamoDB tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-mapping-api-changes.md)
  + [Crea un cliente](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-client)
  + [Stabilire la mappatura alla tabella/indice DynamoDB](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-mapping)
  + [Operazioni sulle tabelle](dynamodb-mapping-api-changes.md#dynamodb-mapping-api-changes-tobleops)
  + [Classi e proprietà della mappa](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas)
    + [Annotazioni Bean](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos)
    + [Annotazioni aggiuntive V2](dynamodb-mapping-api-changes.md#dynamodb-mapping-schemas-annos-v2-addnl)
  + [Configurazione](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration)
    + [Configurazione per operazione](dynamodb-mapping-api-changes.md#dynamodb-mapping-configuration-per-op)
  + [Condizionali](dynamodb-mapping-api-changes.md#dynamodb-mapping-conditionals)
  + [Conversione del tipo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv)
    + [Convertitori predefiniti](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-defaults)
    + [Imposta un convertitore personalizzato per un attributo](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-anno)
    + [Aggiungi una fabbrica o un fornitore di convertitori di tipi](dynamodb-mapping-api-changes.md#dynamodb-mapping-type-conv-factory)
+ [Differenze nella gestione delle stringhe tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-migration-string-handling.md)
+ [Differenze di blocco ottimistiche tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-migrate-optimstic-locking.md)
+ [Fluent setter: differenze tra la versione 1 e la versione 2 dell'SDK for Java](dynamodb-migrate-fluent-setters.md)

# Modifiche di alto livello nelle librerie di mappatura dalla versione 1 alla versione 2 dell'SDK for Java
<a name="dynamodb-mapping-high-level"></a>

I nomi del client di mappatura in ciascuna libreria differiscono in V1 e V2:
+ V1 - Dinamo DBMapper
+ V2 - Client avanzato per DynamoDB

Interagisci con le due librerie più o meno allo stesso modo: crei un'istanza mapper/client e poi fornisci un POJO Java a APIs chi legge e scrive questi elementi nelle tabelle DynamoDB. Entrambe le librerie offrono anche annotazioni per la classe del POJO per indicare il modo in cui il client gestisce il POJO. 

Le differenze notevoli quando si passa alla V2 includono:
+ V2 e V1 utilizzano nomi di metodi diversi per le operazioni DynamoDB di basso livello. Esempio:    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-high-level.html)
+ V2 offre diversi modi per definire schemi di tabelle e POJOs mapparli su tabelle. Puoi scegliere tra l'uso di annotazioni o uno schema generato dal codice utilizzando un builder. V2 offre anche versioni mutabili e immutabili degli schemi.
+ Con V2, si crea specificamente lo schema della tabella come uno dei primi passaggi, mentre in V1, lo schema della tabella viene dedotto dalla classe annotata secondo necessità.
+ [La V2 include il client [Document API nell'API client](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/document/EnhancedDocument.html) avanzata, mentre la V1 utilizza un'API separata.](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/document/DynamoDB.html)
+ Tutti APIs sono disponibili nelle versioni sincrone e asincrone in V2.

Consulta la sezione sulla [mappatura di DynamoDB](dynamodb-enhanced-client.md) in questa guida per informazioni più dettagliate sul client avanzato V2.

## Importa le differenze di dipendenza
<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 [Ultima versione](https://central.sonatype.com/artifact/software.amazon.awssdk/bom).

Nella V1, una singola dipendenza include sia l'API DynamoDB di basso livello che l'API, mentre nella V2, si utilizza mapping/document `dynamodb-enhanced` la dipendenza degli artefatti per accedere all'API. mapping/document Il `dynamodb-enhanced` modulo contiene una dipendenza transitiva dal modulo di basso livello. `dynamodb` 

# Modifiche nella APIs mappatura di DynamoDB tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-mapping-api-changes"></a>

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


****  

| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
|   Istanziazione normale  |  <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>  | 
|   Istanziazione minima  |  <pre>AmazonDynamoDB standardClient = AmazonDynamoDBClientBuilder.standard();<br />DynamoDBMapper mapper = new DynamoDBMapper(standardClient);</pre>  |  <pre>DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.create();</pre>  | 
|   Con trasformatore di attributi \$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>  | 

\$1 Le estensioni in V2 corrispondono all'incirca ai trasformatori di attributi in V1. La [Usa le estensioni per personalizzare le operazioni di DynamoDB Enhanced Client](ddb-en-client-extensions.md) sezione contiene ulteriori informazioni sulle estensioni in V2. 

## Stabilire la mappatura alla tabella/indice DynamoDB
<a name="dynamodb-mapping-api-changes-mapping"></a>

Nella V1, si specifica il nome di una tabella DynamoDB tramite un'annotazione bean. Nella V2, un metodo factory`table()`, produce un'istanza `DynamoDbTable` che rappresenta la tabella DynamoDB remota. Il primo parametro del `table()` metodo è il nome della tabella DynamoDB.


****  

| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
|   Mappa la classe Java POJO sulla tabella 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>  | 
|   Mappare su un indice secondario DynamoDB  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) La sezione della DynamoDB Developer Guide che [illustra il metodo `query` V1](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.Methods.html#DynamoDBMapper.Methods.query) mostra un esempio completo.  |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) La [Usa indici secondari](ddb-en-client-use-secindex.md) sezione di questa guida fornisce ulteriori informazioni.  | 

## Operazioni sulle tabelle
<a name="dynamodb-mapping-api-changes-tobleops"></a>

Questa sezione descrive le operazioni APIs che differiscono tra V1 e V2 per la maggior parte dei casi d'uso standard. 

Nella V2, tutte le operazioni che coinvolgono una singola tabella vengono chiamate sull'`DynamoDbTable`istanza, non sul client avanzato. Il client avanzato contiene metodi che possono indirizzare più tabelle. 

Nella *tabella denominata Table operations* riportata di seguito, un'istanza POJO viene definita come `item` o come un tipo specifico come`customer1`. Per gli esempi V2, le istanze denominate `table` sono il risultato di una chiamata precedente `enhancedClient.table()` che restituisce un riferimento all'istanza. `DynamoDbTable`

Tieni presente che la maggior parte delle operazioni V2 può essere richiamata con uno schema di consumo fluido anche se non vengono visualizzate. Ad esempio, 

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

Per le operazioni V1, *Table operations* (di seguito) contiene alcuni dei moduli più comunemente usati e non tutti i moduli sovraccaricati. Ad esempio, il `load()` metodo presenta i seguenti sovraccarichi:

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

*Le operazioni della tabella* (di seguito) mostrano i moduli più comunemente usati:

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


**Operazioni sulle tabelle**  

| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
|  Scrivere un Java POJO su una tabella DynamoDB Operazione **DynamoDB:**, `PutItem` `UpdateItem`  |  <pre>mapper.save(item)<br />mapper.save(item, config)<br />mapper.save(item, saveExpression, config)</pre> Nella V1, `DynamoDBMapperConfig.SaveBehavior` and annotations determina quale metodo DynamoDB di basso livello verrà chiamato. In generale, `UpdateItem` viene chiamato tranne quando si usa and. `SaveBehavior.CLOBBER` `SaveBehavior.PUT` Le chiavi generate automaticamente sono un caso d'uso speciale e occasionalmente `UpdateItem` vengono utilizzate entrambe`PutItem`.  |  <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>  | 
|  Leggere un elemento da una tabella DynamoDB a un Java POJO **Funzionamento 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>  | 
|  Eliminare un elemento da una tabella DynamoDB **Funzionamento DynamoDB:** `DeleteItem`  |  <pre>mapper.delete(item, deleteExpression, config)</pre>  |  <pre>table.deleteItem(deleteItemRequest)<br />table.deleteItem(item)<br />table.deleteItem(key)</pre>  | 
|  Interroga una tabella o un indice secondario DynamoDB e restituisci un elenco impaginato **Funzionamento 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> Usa il valore restituito `PageIterable.stream()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.subscribe()` per le risposte asincrone  | 
|  Interroga una tabella o un indice secondario DynamoDB e restituisci un elenco **Funzionamento 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> Usa il valore restituito `PageIterable.items()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.items.subscribe()` per le risposte asincrone  | 
|  Scansiona una tabella o un indice secondario DynamoDB e restituisci un elenco impaginato **Funzionamento 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> Usa il valore restituito `PageIterable.stream()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.subscribe()` per le risposte asincrone  | 
|  Scansiona una tabella o un indice secondario DynamoDB e restituisci un elenco **Funzionamento 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> Usa il valore restituito `PageIterable.items()` (lazy loading) per le risposte di sincronizzazione e `PagePublisher.items.subscribe()` per le risposte asincrone  | 
|  Leggi più elementi da più tabelle in un batch **Funzionamento 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>  | 
|  Scrivi più elementi su più tabelle in un batch **Funzionamento 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>  | 
|  Eliminare più elementi da più tabelle in un batch **Funzionamento 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>  | 
|  Scrittura/elimina più elementi in un batch **Funzionamento 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>  | 
|  Eseguire una scrittura transazionale **Funzionamento DynamoDB:** `TransactWriteItems`  |  <pre>mapper.transactionWrite(transactionWriteRequest)</pre>  |  <pre>enhancedClient.transactWriteItems(transasctWriteItemsRequest)</pre>  | 
|  Effettuare una lettura transazionale **Funzionamento DynamoDB:** `TransactGetItems`  |  <pre>mapper.transactionLoad(transactionLoadRequest)</pre>  |  <pre>enhancedClient.transactGetItems(transactGetItemsRequest) </pre>  | 
|  Ottieni un conteggio degli elementi corrispondenti di una query Funzionamento **DynamoDB:** con `Query` `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>  | 
|  Ottieni un conteggio degli elementi corrispondenti di una scansione Funzionamento **DynamoDB:** con `Scan` `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>  | 
|  Crea una tabella in DynamoDB corrispondente alla classe POJO **Funzionamento DynamoDB:** `CreateTable`  |  <pre>mapper.generateCreateTableRequest(Customer.class)</pre> L'istruzione precedente genera una richiesta di creazione della tabella di basso livello; gli utenti devono chiamare `createTable` il client 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>  | 
|  Esegui una scansione parallela in DynamoDB **`Scan`Funzionamento DynamoDB:** con e parametri `Segment` `TotalSegments`  |  <pre>mapper.parallelScan(Customer.class, <br />                    scanExpression, <br />                    numTotalSegments)</pre>  |  Gli utenti devono gestire i thread di lavoro e le chiamate `scan` per ogni segmento: <pre>table.scan(r -> r.segment(0).totalSegments(5))</pre>  | 
|  Integra Amazon S3 con DynamoDB per archiviare collegamenti S3 intelligenti  |  <pre>mapper.createS3Link(bucket, key)<br />mapper.getS3ClientCache()</pre>  |  Non è supportato perché abbina Amazon S3 e DynamoDB.  | 

## Classi e proprietà della mappa
<a name="dynamodb-mapping-schemas"></a>

Sia in V1 che in V2, si mappano le classi alle tabelle utilizzando annotazioni in stile bean. V2 offre anche [altri modi per definire schemi per casi d'uso specifici, come](ddb-en-client-adv-features.md#ddb-en-client-adv-features-schm-overview) lavorare con classi immutabili.

### Annotazioni Bean
<a name="dynamodb-mapping-schemas-annos"></a>

La tabella seguente mostra le annotazioni bean equivalenti per un caso d'uso specifico utilizzate in V1 e V2. Uno scenario `Customer` di classe viene utilizzato per illustrare i parametri.

Le annotazioni, così come le classi e le enumerazioni, in V2 seguono la convenzione camel case e utilizzano '', non 'DynamoDB'. DynamoDb


| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
| Mappa la classe sulla tabella |  <pre>@DynamoDBTable (tableName ="CustomerTable")</pre>  | <pre>@DynamoDbBean<br />@DynamoDbBean(converterProviders = {...})</pre>Il nome della tabella viene definito quando si chiama il DynamoDbEnhancedClient\$1table() metodo. | 
| Designate un membro della classe come attributo della tabella  |  <pre>@DynamoDBAttribute(attributeName = "customerName")</pre>  |  <pre>@DynamoDbAttribute("customerName") </pre>  | 
| Designare un membro della classe è una chiave hash/partition  |  <pre>@DynamoDBHashKey </pre>  |  <pre>@DynamoDbPartitionKey</pre>  | 
| Designare un membro della classe è fondamentale range/sort  |  <pre>@DynamoDBRangeKey </pre>  |  <pre>@DynamoDbSortKey </pre>  | 
| Designare un membro della classe come chiave di hash/partizione dell'indice secondaria |  <pre>@DynamoDBIndexHashKey </pre>  |  <pre>@DynamoDbSecondaryPartitionKey </pre>  | 
| Designare un membro della classe come chiave di ordinamento/intervallo di indice secondaria |  <pre>@DynamoDBIndexRangeKey </pre>  |  <pre>@DynamoDbSecondarySortKey </pre>  | 
| Ignora questo membro della classe durante la mappatura su una tabella |  <pre>@DynamoDBIgnore </pre>  |  <pre>@DynamoDbIgnore</pre>  | 
| Designare un membro della classe come attributo chiave UUID generato automaticamente |  <pre>@DynamoDBAutoGeneratedKey</pre>  |  <pre>@DynamoDbAutoGeneratedUuid </pre> L'estensione che lo fornisce non viene caricata per impostazione predefinita; è necessario aggiungere l'estensione a client builder.  | 
| Designare un membro della classe come attributo timestamp generato automaticamente |  <pre>@DynamoDBAutoGeneratedTimestamp</pre>  |  <pre>@DynamoDbAutoGeneratedTimestampAttribute</pre> L'estensione che lo fornisce non viene caricata per impostazione predefinita; è necessario aggiungere l'estensione a client builder.  | 
| Designare un membro della classe come attributo di versione con incremento automatico |  <pre>@DynamoDBVersionAttribute</pre>  |  <pre>@DynamoDbVersionAttribute</pre> L'estensione che lo fornisce viene caricata automaticamente.  | 
| Designate un membro della classe come richiedente una conversione personalizzata |  <pre>@DynamoDBTypeConverted</pre>  |  <pre>@DynamoDbConvertedBy</pre>  | 
| Designate un membro della classe da memorizzare come tipo di attributo diverso |  <pre>@DynamoDBTyped(<DynamoDBAttributeType>)</pre>  |  Usa un'`AttributeConverter`implementazione. V2 offre molti convertitori integrati per i tipi Java più comuni. Puoi anche implementare il tuo file personalizzato `AttributeConverter` o. `AttributeConverterProvider` Vedi [Controlla la conversione degli attributi](ddb-en-client-adv-features-conversion.md) in questa guida.  | 
| Designare una classe che può essere serializzata in un documento DynamoDB (documento in stile JSON) o in un documento secondario  |  <pre>@DynamoDBDocument</pre>  | Utilizzate l'API Enhanced Document. Consulta le seguenti risorse:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html) | 

### Annotazioni aggiuntive V2
<a name="dynamodb-mapping-schemas-annos-v2-addnl"></a>


| Caso d’uso | V1 | V2 | 
| --- | --- | --- | 
| Designate un membro della classe da non memorizzare come attributo NULL se il valore Java è nullo | N/D |  <pre>@DynamoDbIgnoreNulls</pre>  | 
| Designate un membro della classe come oggetto vuoto se tutti gli attributi sono nulli | N/D |  <pre>@DynamoDbPreserveEmptyObject</pre>  | 
| Designate un'azione speciale di aggiornamento per un membro della classe | N/D |  <pre>@DynamoDbUpdateBehavior</pre>  | 
| Designate una classe immutabile | N/D |  <pre>@DynamoDbImmutable</pre>  | 
| Designare un membro della classe come attributo del contatore ad incremento automatico | N/D |  <pre>@DynamoDbAtomicCounter</pre> L'estensione che fornisce questa funzionalità viene caricata automaticamente.  | 

## Configurazione
<a name="dynamodb-mapping-configuration"></a>

Nella V1, in genere si controllano comportamenti specifici utilizzando un'istanza di. `DynamoDBMapperConfig` È possibile fornire l'oggetto di configurazione quando si crea il mapper o quando si effettua una richiesta. In V2, la configurazione è specifica dell'oggetto di richiesta per l'operazione.


| Caso d’uso | V1 | Impostazione predefinita in V1 | V2 | 
| --- | --- | --- | --- | 
|  |  <pre>DynamoDBMapperConfig.builder()</pre>  |  |  | 
| Strategia di load/write ripetizione dei tentativi in batch |  <pre>  .withBatchLoadRetryStrategy(loadRetryStrategy)</pre> <pre>  .withBatchWriteRetryStrategy(writeRetryStrategy)</pre>  | Riprova gli elementi non riusciti | Configura la strategia di riprova sul dispositivo sottostante. DynamoDBClient Vedi [Configurare il comportamento dei tentativi in AWS SDK for Java 2.x](retry-strategy.md) in questa guida. | 
| Letture coerenti |  <pre>  .withConsistentReads(CONSISTENT)</pre>  | EVENTUAL | Per impostazione predefinita, le letture coerenti sono false per le operazioni di lettura. Sostituisci con .consistentRead(true) sull'oggetto della richiesta. | 
| Schema di conversione con set di marshallers/unmarshallers |  <pre>  .withConversionSchema(conversionSchema)</pre> Le implementazioni statiche forniscono la retrocompatibilità con le versioni precedenti.  | V2\$1COMPATIBLE | Non applicabile. Si tratta di una funzionalità legacy che si riferisce al modo in cui le versioni precedenti di DynamoDB (V1) memorizzavano i tipi di dati e questo comportamento non verrà mantenuto nel client avanzato. Un esempio di comportamento in DynamoDB V1 è l'archiviazione dei valori booleani come numero anziché come booleano. | 
| Nomi delle tabelle |  <pre>  .withObjectTableNameResolver()<br />  .withTableNameOverride() <br />  .withTableNameResolver()</pre> Le implementazioni statiche forniscono la retrocompatibilità con le versioni precedenti  | usa annotation o guess from class |  Il nome della tabella viene definito quando si chiama il `DynamoDbEnhancedClient#table()` metodo.  | 
| Strategia di caricamento della paginazione |  <pre>  .withPaginationLoadingStrategy(strategy)</pre>  Le opzioni sono: LAZY\$1`LOADING`, o `EAGER_LOADING` `ITERATION_ONLY`  | LAZY\$1LOADING |  [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/it_it/sdk-for-java/latest/developer-guide/dynamodb-mapping-api-changes.html)  | 
| Richiedi la raccolta delle metriche |  <pre>  .withRequestMetricCollector(collector)</pre>  | null | Da utilizzare metricPublisher() ClientOverrideConfiguration durante la creazione del client DynamoDB standard.  | 
| Salva il comportamento |  <pre>  .withSaveBehavior(SaveBehavior.CLOBBER) </pre> Le opzioni sono `UPDATE``CLOBBER`,`PUT`,`APPEND_SET`, o`UPDATE_SKIP_NULL_ATTRIBUTES`.  | UPDATE |  In V2, si chiama `putItem()` or in `updateItem()` modo esplicito. `CLOBBER or PUT`: L'azione corrispondente nella v 2 è la chiamata. `putItem()` Non esiste una `CLOBBER` configurazione specifica. `UPDATE`: Corrisponde a `updateItem()` `UPDATE_SKIP_NULL_ATTRIBUTES`: Corrisponde a`updateItem()`. Controlla il comportamento di aggiornamento con l'impostazione della richiesta `ignoreNulls` e l'annotazione/tag`DynamoDbUpdateBehavior`. `APPEND_SET`: non supportato  | 
| Tipo: fabbrica di convertitori |  <pre>  .withTypeConverterFactory(typeConverterFactory) </pre>  | convertitori di tipo standard |  Impostare sul fagiolo utilizzando <pre>@DynamoDbBean(converterProviders = {ConverterProvider.class, <br />        DefaultAttributeConverterProvider.class})</pre>  | 

### Configurazione per operazione
<a name="dynamodb-mapping-configuration-per-op"></a>

In V1, alcune operazioni, ad esempio`query()`, sono altamente configurabili tramite un oggetto «espressione» inviato all'operazione. Esempio:

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

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

In V2, invece di utilizzare un oggetto di configurazione, si impostano i parametri sull'oggetto di richiesta utilizzando un builder. Esempio:

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

customerTable.query(emailBw);
```

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

In V2, le espressioni condizionali e di filtraggio vengono espresse utilizzando un `Expression` oggetto, che incapsula la condizione e la mappatura di nomi e filtri. 


| Caso d’uso | Operazioni | V1 | V2 | 
| --- | --- | --- | --- | 
| Condizioni previste per gli attributi | save (), delete (), query (), scan () |  <pre>new DynamoDBSaveExpression()<br />  .withExpected(Collections.singletonMap(<br />      "otherAttribute", new ExpectedAttributeValue(false)))<br />  .withConditionalOperator(ConditionalOperator.AND);</pre>  | Obsoleto; da usare al suo posto. ConditionExpression | 
| Espressione condizionale | 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>  | 
| Espressione filtro | interrogazione (), scansione () |  <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>  | 
| Espressione di condizione per la query | interrogazione () |  <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>  | 

## Conversione del tipo
<a name="dynamodb-mapping-type-conv"></a>

### Convertitori predefiniti
<a name="dynamodb-mapping-type-conv-defaults"></a>

Nella versione 2, l'SDK fornisce un set di convertitori predefiniti per tutti i tipi più comuni. È possibile modificare i convertitori di tipo sia a livello generale del provider che per un singolo attributo. Puoi trovare un elenco dei convertitori disponibili nel riferimento [AttributeConverter](https://sdk.amazonaws.com/java/api/latest/software/amazon/awssdk/enhanced/dynamodb/AttributeConverter.html)API.

### Imposta un convertitore personalizzato per un attributo
<a name="dynamodb-mapping-type-conv-anno"></a>

Nella V1, è possibile annotare un metodo getter con `@DynamoDBTypeConverted` per specificare la classe che esegue la conversione tra il tipo di attributo Java e un tipo di attributo DynamoDB. Ad esempio, è possibile applicare una stringa `CurrencyFormatConverter` che converte tra un `Currency` tipo Java e una stringa DynamoDB come mostrato nel seguente frammento.

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

L'equivalente V2 dello snippet precedente è mostrato di seguito.

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

**Nota**  
In V1, puoi applicare l'annotazione all'attributo stesso, a un tipo o a un'annotazione definita dall'utente, V2 supporta l'applicazione dell'annotazione solo al getter.

### Aggiungi una fabbrica o un fornitore di convertitori di tipi
<a name="dynamodb-mapping-type-conv-factory"></a>

Nella V1, puoi fornire il tuo set di convertitori di tipo o sostituire i tipi che ti interessano aggiungendo una fabbrica di convertitori di tipo alla configurazione. Il type converter factory si estende e `DynamoDBTypeConverterFactory` le sostituzioni vengono eseguite ottenendo un riferimento al set predefinito ed estendendolo. Il seguente frammento mostra come eseguire questa operazione.

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

V2 offre funzionalità simili tramite l'annotazione. `@DynamoDbBean` È possibile fornire una singola `AttributeConverterProvider` o una catena di messaggi ordinati`AttributeConverterProvider`. Tieni presente che se fornisci la tua catena di fornitori di convertitori di attributi, sostituirai il fornitore di convertitori predefinito e dovrai includerlo nella catena per utilizzare i suoi convertitori di attributi. 

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

La sezione sulla [conversione degli attributi di](ddb-en-client-adv-features-conversion.md#ddb-en-client-adv-features-conversion-example) questa guida contiene un esempio completo per V2.

# Differenze nella gestione delle stringhe tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-migration-string-handling"></a>

V1 e V2 gestiscono le stringhe vuote in modo diverso quando inviano dati a DynamoDB:
+ **V1**: converte le stringhe vuote in valori nulli prima di inviarle a DynamoDB (con conseguente assenza di attributo)
+ **V2**: invia stringhe vuote come valori effettivi di stringhe vuote a DynamoDB

**Importante**  
Dopo la migrazione alla V2, se non desideri che stringhe vuote vengano archiviate in DynamoDB, devi implementare convertitori personalizzati. Senza convertitori personalizzati, V2 memorizza le stringhe vuote come attributi di stringa vuota effettivi negli elementi DynamoDB, il che differisce dal comportamento della V1 di omettere completamente questi attributi.

**Example convertitore personalizzato per V2 che converte un attributo di stringa vuoto in null**  

```
/**
 * 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;
    }
}
```



# Differenze di blocco ottimistiche tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-migrate-optimstic-locking"></a>

Sia la V1 che la V2 implementano il blocco ottimistico con un'annotazione di attributo che contrassegna una proprietà sulla classe bean per memorizzare il numero di versione.


**Differenze nel comportamento di blocco ottimistico**  

|  | V1 | V2 | 
| --- | --- | --- | 
| Annotazione della classe Bean | @DynamoDBVersionAttribute | @DynamoDbVersionAttribute(nota che V2 usa una «b» minuscola) | 
| Salvataggio iniziale | Attributo del numero di versione impostato su 1. |  Il valore iniziale per l'attributo di versione impostato con`@DynamoDbVersionAttribute(startAt = X)`. Il valore predefinito è 0.  | 
| Aggiorna | L'attributo del numero di versione viene incrementato di 1 se il controllo condizionale verifica che il numero di versione dell'oggetto da aggiornare corrisponda al numero nel database. |  L'attributo del numero di versione viene incrementato se il controllo condizionale verifica che il numero di versione dell'oggetto da aggiornare corrisponda al numero nel database. L'attributo del numero di versione incrementato dall'opzione impostata con. `incrementBy` `@DynamoDbVersionAttribute(incrementBy = X)` Il valore predefinito è 1.  | 
| Elimina | DynamoDBMapperaggiunge un controllo condizionale che il numero di versione dell'oggetto da eliminare corrisponda al numero di versione nel database. |  V2 non aggiunge automaticamente condizioni per le operazioni di eliminazione. È necessario aggiungere manualmente le espressioni di condizione se si desidera controllare il comportamento di eliminazione. Nell'esempio seguente `recordVersion` è riportato l'attributo version 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>  | 
| Scrittura transazionale con controllo delle condizioni | Non è possibile utilizzare una classe bean con annotazioni @DynamoDBVersionAttribute in un metodo. addConditionCheck | È possibile utilizzare una classe bean con l'@DynamoDbVersionAttributeannotazione in un metodo addConditionCheck builder per una richiesta. transactWriteItems | 
| Disabilita | Disabilita il blocco ottimistico modificando il valore di  DynamoDBMapperConfig.SaveBehavior enumerazione da a. UPDATE CLOBBER |  Non utilizzare l'annotazione. `@DynamoDbVersionAttribute`  | 

# Fluent setter: differenze tra la versione 1 e la versione 2 dell'SDK for Java
<a name="dynamodb-migrate-fluent-setters"></a>

È possibile utilizzarlo POJOs con i setter fluenti nell'API di mappatura DynamoDB per V1 e con V2 a partire dalla versione 2.30.29. 

Ad esempio, il seguente POJO restituisce un'istanza del metodo: `Customer` `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;
  }
}
```

Tuttavia, se si utilizza una versione della V2 precedente alla 2.30.29, `setName` restituisce un'`Customer`istanza con un valore di. `name` `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.
  }
}
```