

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à.

# Panoramica del supporto AWS SDK per DynamoDB
<a name="Programming.SDKOverview"></a>

Il diagramma seguente fornisce una panoramica di alto livello della programmazione di applicazioni Amazon DynamoDB utilizzando il. AWS SDKs

![\[Modello di programmazione per l'utilizzo di DynamoDB con. AWS SDKs\]](http://docs.aws.amazon.com/it_it/amazondynamodb/latest/developerguide/images/SDKSupport.png)


1. Scrivi un'applicazione utilizzando un AWS SDK per il tuo linguaggio di programmazione.

1. Ogni AWS SDK fornisce una o più interfacce programmatiche per lavorare con DynamoDB. Le interfacce specifiche disponibili dipendono dal linguaggio di programmazione e dall'SDK utilizzati. AWS Le opzioni includono:
   + [Interfacce di basso livello che funzionano con DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.LowLevel)
   + [Interfacce documentali che funzionano con DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.Document)
   + [Interfacce di persistenza degli oggetti che funzionano con DynamoDB](Programming.SDKs.Interfaces.md#Programming.SDKs.Interfaces.Mapper)
   + [Interfacce di alto livello](HigherLevelInterfaces.md)

1. L' AWS SDK crea richieste HTTP (S) da utilizzare con l'API DynamoDB di basso livello.

1. L' AWS SDK invia la richiesta all'endpoint DynamoDB.

1. DynamoDB esegue la richiesta. Se la richiesta ha esito positivo, DynamoDB restituisce un codice di risposta HTTP 200 (OK). Se la richiesta ha esito negativo, DynamoDB restituisce un codice di errore HTTP e un messaggio di errore.

1. L' AWS SDK elabora la risposta e la ripropaga all'applicazione.

Ciascuno di essi AWS SDKs fornisce servizi importanti all'applicazione, tra cui:
+ Formattazione delle richieste HTTP(S) e serializzazione dei parametri di richiesta.
+ Generazione di una firma di crittografia per ogni richiesta.
+ Inoltro delle richieste a un endpoint DynamoDB e ricezione delle risposte da DynamoDB.
+ Estrazione dei risultati da quelle risposte.
+ Implementazione della logica dei nuovi tentativi di base in caso di errori.

Per nessuna di queste attività non occorre scrivere del codice.

**Nota**  
Per ulteriori informazioni AWS SDKs, comprese le istruzioni di installazione e la documentazione, consulta [Tools for Amazon Web Services](https://aws.amazon.com/tools).

## Supporto SDK per endpoint basati su AWS account
<a name="Programming.SDKs.endpoints"></a>

AWS sta implementando il supporto SDK per gli AWS endpoint basati su account per DynamoDB, a partire dall'SDK for AWS Java V1 il 4 settembre 2024. Questi nuovi endpoint aiutano a garantire prestazioni e scalabilità elevate. AWS L'aggiornamento SDKs utilizzerà automaticamente i nuovi endpoint, che hanno il formato. `https://(account-id).ddb.(region).amazonaws.com`

Se si utilizza una singola istanza di un client SDK per effettuare richieste a più account, l’applicazione avrà meno opportunità di riutilizzare le connessioni. AWS consiglia di modificare le applicazioni per connettersi a un minor numero di account per istanza del client SDK. Un'alternativa consiste nell'impostare il client SDK in modo che continui a utilizzare gli endpoint regionali utilizzando l'`ACCOUNT_ID_ENDPOINT_MODE`impostazione, come documentato nella [https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html](https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html) Tools Reference Guide.

# Interfacce programmatiche che funzionano con DynamoDB
<a name="Programming.SDKs.Interfaces"></a>

Ciascun [SDK AWS](https://aws.amazon.com/tools) fornisce una o più interfacce programmatiche per lavorare con Amazon DynamoDB. Queste interfacce spaziano da semplici wrapper DynamoDB di basso livello a livelli di persistenza basati sugli oggetti. Le interfacce disponibili variano a seconda dell' AWS SDK e del linguaggio di programmazione utilizzati.

![\[Interfacce programmatiche disponibili in diverse versioni AWS SDKs per lavorare con DynamoDB.\]](http://docs.aws.amazon.com/it_it/amazondynamodb/latest/developerguide/images/SDKSupport.SDKInterfaces.png)


Nella sezione seguente sono descritte alcune delle interfacce disponibili con AWS SDK per Java come esempio (Non tutte le interfacce sono disponibili in tutte.) AWS SDKs

**Topics**
+ [Interfacce di basso livello che funzionano con DynamoDB](#Programming.SDKs.Interfaces.LowLevel)
+ [Interfacce documentali che funzionano con DynamoDB](#Programming.SDKs.Interfaces.Document)
+ [Interfacce di persistenza degli oggetti che funzionano con DynamoDB](#Programming.SDKs.Interfaces.Mapper)

## Interfacce di basso livello che funzionano con DynamoDB
<a name="Programming.SDKs.Interfaces.LowLevel"></a>

Ogni AWS SDK specifico per una lingua fornisce un'interfaccia di basso livello per Amazon DynamoDB, con metodi molto simili alle richieste API DynamoDB di basso livello.

In alcuni casi, sarà necessario identificare i tipi di dati degli attributi utilizzando [Descrittori del tipo di dati](Programming.LowLevelAPI.md#Programming.LowLevelAPI.DataTypeDescriptors), ad esempio `S` per stringa o `N` per numero

**Nota**  
Un'interfaccia di basso livello è disponibile in ogni SDK AWS specifico per il linguaggio.

Il seguente programma Java utilizza l'interfaccia di basso livello di AWS SDK per Java. 

### Esempio di interfaccia di basso livello
<a name="low-level-example"></a>

```
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.AttributeValue;
import software.amazon.awssdk.services.dynamodb.model.GetItemRequest;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * Before running this Java V2 code example, set up your development
 * environment, including your credentials.
 *
 * For more information, see the following documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 *
 * To get an item from an Amazon DynamoDB table using the AWS SDK for Java V2,
 * its better practice to use the
 * Enhanced Client, see the EnhancedGetItem example.
 */
public class GetItem {
    public static void main(String[] args) {
        final String usage = """

                Usage:
                    <tableName> <key> <keyVal>

                Where:
                    tableName - The Amazon DynamoDB table from which an item is retrieved (for example, Music3).\s
                    key - The key used in the Amazon DynamoDB table (for example, Artist).\s
                    keyval - The key value that represents the item to get (for example, Famous Band).
                """;

        if (args.length != 3) {
            System.out.println(usage);
            System.exit(1);
        }

        String tableName = args[0];
        String key = args[1];
        String keyVal = args[2];
        System.out.format("Retrieving item \"%s\" from \"%s\"\n", keyVal, tableName);
        Region region = Region.US_EAST_1;
        DynamoDbClient ddb = DynamoDbClient.builder()
                .region(region)
                .build();

        getDynamoDBItem(ddb, tableName, key, keyVal);
        ddb.close();
    }

    public static void getDynamoDBItem(DynamoDbClient ddb, String tableName, String key, String keyVal) {
        HashMap<String, AttributeValue> keyToGet = new HashMap<>();
        keyToGet.put(key, AttributeValue.builder()
                .s(keyVal)
                .build());

        GetItemRequest request = GetItemRequest.builder()
                .key(keyToGet)
                .tableName(tableName)
                .build();

        try {
            // If there is no matching item, GetItem does not return any data.
            Map<String, AttributeValue> returnedItem = ddb.getItem(request).item();
            if (returnedItem.isEmpty())
                System.out.format("No item found with the key %s!\n", key);
            else {
                Set<String> keys = returnedItem.keySet();
                System.out.println("Amazon DynamoDB table attributes: \n");
                for (String key1 : keys) {
                    System.out.format("%s: %s\n", key1, returnedItem.get(key1).toString());
                }
            }

        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}
```

## Interfacce documentali che funzionano con DynamoDB
<a name="Programming.SDKs.Interfaces.Document"></a>

Molti AWS SDKs forniscono un'interfaccia documentale che consente di eseguire operazioni sul piano dei dati (creazione, lettura, aggiornamento, eliminazione) su tabelle e indici. Con un’interfaccia documentale, non è necessario specificare [Descrittori del tipo di dati](Programming.LowLevelAPI.md#Programming.LowLevelAPI.DataTypeDescriptors). I tipi di dati sono impliciti nella semantica dei dati stessi. Questi forniscono AWS SDKs anche metodi per convertire facilmente documenti JSON da e verso tipi di dati Amazon DynamoDB nativi.

**Nota**  
[Le interfacce documentali sono disponibili nei formati AWS SDKs per [Java](https://aws.amazon.com/sdk-for-java), [.NET](https://aws.amazon.com/sdk-for-net), [Node.js](https://aws.amazon.com/sdk-for-node-js) e SDK. JavaScript](https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/)

Il seguente programma Java utilizza l’interfaccia documentale di AWS SDK per Java. Il programma crea un oggetto `Table` che rappresenta la tabella `Music` e quindi chiede all'oggetto di utilizzare `GetItem` per recuperare una canzone. Il programma restituisce quindi l'anno in cui è uscita la canzone.

La classe `software.amazon.dynamodb.document.DynamoDB` implementa l'interfaccia di documento di DynamoDB. Notare come `DynamoDB` funge da wrapper per il client di basso livello (`AmazonDynamoDB`).

### Esempio di interfaccia documentale
<a name="document-level-example"></a>

```
package com.amazonaws.codesamples.gsg;

import software.amazon.dynamodb.AmazonDynamoDB;
import software.amazon.dynamodb.AmazonDynamoDBClientBuilder;
import software.amazon.dynamodb.document.DynamoDB;
import software.amazon.dynamodb.document.GetItemOutcome;
import software.amazon.dynamodb.document.Table;

public class MusicDocumentDemo {

    public static void main(String[] args) {

        AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();
        DynamoDB docClient = new DynamoDB(client);

        Table table = docClient.getTable("Music");
        GetItemOutcome outcome = table.getItemOutcome(
                "Artist", "No One You Know",
                "SongTitle", "Call Me Today");

        int year = outcome.getItem().getInt("Year");
        System.out.println("The song was released in " + year);

    }
}
```

## Interfacce di persistenza degli oggetti che funzionano con DynamoDB
<a name="Programming.SDKs.Interfaces.Mapper"></a>

Alcune AWS SDKs forniscono un'interfaccia di persistenza degli oggetti in cui non si eseguono direttamente operazioni sul piano dati. Invece, è possibile creare oggetti che rappresentano elementi nelle tabelle e negli indici di Amazon DynamoDB e interagire solo con quegli oggetti. Ciò consente di scrivere codice incentrato sugli oggetti piuttosto che codice incentrato sul database.

**Nota**  
Le interfacce di persistenza degli oggetti sono disponibili in Java AWS SDKs e.NET. Per ulteriori informazioni, consulta [Interfacce di programmazione di livello superiore per DynamoDB](HigherLevelInterfaces.md) per Dynamo DB.

### Esempio di interfaccia di persistenza degli oggetti
<a name="mapper-level-example"></a>

```
import com.example.dynamodb.Customer;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;
```

```
import com.example.dynamodb.Customer;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbEnhancedClient;
import software.amazon.awssdk.enhanced.dynamodb.DynamoDbTable;
import software.amazon.awssdk.enhanced.dynamodb.Key;
import software.amazon.awssdk.enhanced.dynamodb.TableSchema;
import software.amazon.awssdk.enhanced.dynamodb.model.GetItemEnhancedRequest;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.dynamodb.DynamoDbClient;
import software.amazon.awssdk.services.dynamodb.model.DynamoDbException;

/*
 * Before running this code example, create an Amazon DynamoDB table named Customer with these columns:
 *   - id - the id of the record that is the key. Be sure one of the id values is `id101`
 *   - custName - the customer name
 *   - email - the email value
 *   - registrationDate - an instant value when the item was added to the table. These values
 *                        need to be in the form of `YYYY-MM-DDTHH:mm:ssZ`, such as 2022-07-11T00:00:00Z
 *
 * Also, ensure that you have set up your development environment, including your credentials.
 *
 * For information, see this documentation topic:
 *
 * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html
 */

public class EnhancedGetItem {
    public static void main(String[] args) {
        Region region = Region.US_EAST_1;
        DynamoDbClient ddb = DynamoDbClient.builder()
                .region(region)
                .build();

        DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();

        getItem(enhancedClient);
        ddb.close();
    }

    public static String getItem(DynamoDbEnhancedClient enhancedClient) {
        Customer result = null;
        try {
            DynamoDbTable<Customer> table = enhancedClient.table("Customer", TableSchema.fromBean(Customer.class));
            Key key = Key.builder()
                    .partitionValue("id101").sortValue("tred@noserver.com")
                    .build();

            // Get the item by using the key.
            result = table.getItem(
                    (GetItemEnhancedRequest.Builder requestBuilder) -> requestBuilder.key(key));
            System.out.println("******* The description value is " + result.getCustName());

        } catch (DynamoDbException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
        return result.getCustName();
    }
}
```

# Interfacce di programmazione di livello superiore per DynamoDB
<a name="HigherLevelInterfaces"></a>

 AWS SDKs Forniscono applicazioni con interfacce di basso livello per lavorare con Amazon DynamoDB. Queste classi e metodi lato client corrispondono direttamente all'API DynamoDB di basso livello. Tuttavia, molti sviluppatori sperimentano un senso di disconnessione, o *mancata corrispondenza dell'impedenza*, quando è necessario mappare tipi di dati complessi agli elementi di una tabella di database. Con un'interfaccia di database di basso livello, gli sviluppatori devono scrivere metodi per leggere o scrivere i dati oggetto nelle tabelle di database e viceversa. La quantità di codice aggiuntivo richiesto per ogni combinazione di tipo di oggetto e tabella di database può sembrare travolgente.

Per semplificare lo sviluppo, le versioni AWS SDKs per Java e.NET forniscono interfacce aggiuntive con livelli di astrazione più elevati. Le interfacce di livello superiore per DynamoDB consentono di definire le relazioni tra gli oggetti del programma e le tabelle di database che memorizzano i dati di tali oggetti. Dopo aver definito questa mappatura, vengono richiamati metodi oggetto semplici come `save`, `load` oppure`delete` e le operazioni di DynamoDB di basso livello sottostanti vengono richiamate automaticamente per conto dell'utente. Ciò consente di scrivere codice incentrato sugli oggetti piuttosto che codice incentrato sul database.

Le interfacce di programmazione di livello superiore per DynamoDB sono disponibili in Java e.NET. AWS SDKs 

**Java**
+ [Java 1.x: Dinamo DBMapper](DynamoDBMapper.md)
+ [Java 2.x: Client avanzato DynamoDB](DynamoDBEnhanced.md)

**.NET**
+ [Utilizzo del modello documentale .NET in DynamoDB](DotNetSDKMidLevel.md)
+ [Operazioni con il modello di persistenza degli oggetti di .NET e DynamoDB](DotNetSDKHighLevel.md)

# Java 1.x: Dinamo DBMapper
<a name="DynamoDBMapper"></a>

**Nota**  
L’SDK per Java è disponibile in due versioni: 1.x e 2.x. [La versione end-of-support per 1.x è stata annunciata il 12 gennaio 2024.](https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-java-v1-x-on-december-31-2025/) Lo farà e scadrà end-of-support il 31 dicembre 2025. Per sviluppare ex novo, si consiglia vivamente di utilizzare 2.x.

 AWS SDK per Java Fornisce una `DynamoDBMapper` classe che consente di mappare le classi lato client alle tabelle Amazon DynamoDB. Per utilizzare `DynamoDBMapper`, definire la relazione tra gli elementi di una tabella DynamoDB e le istanze di oggetto corrispondenti nel codice. La classe `DynamoDBMapper` consente di eseguire diverse operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD) sugli elementi e di eseguire query e scansioni sulle tabelle.

**Topics**
+ [Classe Dynamo DBMapper](DynamoDBMapper.Methods.md)
+ [Tipi di dati supportati per Dynamo for Java DBMapper](DynamoDBMapper.DataTypes.md)
+ [Annotazioni Java per DynamoDB](DynamoDBMapper.Annotations.md)
+ [Impostazioni di configurazione opzionali per Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md)
+ [DynamoDB e blocco ottimistico con il numero di versione](DynamoDBMapper.OptimisticLocking.md)
+ [Mappatura dei dati arbitrari in DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md)
+ [Esempi della classe DynamoDBMapper](DynamoDBMapper.Examples.md)

**Nota**  
La classe `DynamoDBMapper` non ti consente di creare, aggiornare o eliminare tabelle. Per eseguire queste attività, utilizza invece l'interfaccia SDK per Java di basso livello.

SDK per Java fornisce una serie di tipi di annotazione in modo che sia possibile mappare le classi alle tabelle. Ad esempio, considera una tabella `ProductCatalog` la cui chiave di partizione sia l'`Id`. 

```
ProductCatalog(Id, ...)
```

Puoi mappare una classe nell'applicazione client alla tabella `ProductCatalog`, come mostrato nel seguente codice Java. Questo codice definisce un Plain Old Java Object (POJO), denominato `CatalogItem`, il quale utilizza annotazioni per mappare campi di oggetto ai nomi di attributo di DynamoDB.

**Example**  

```
package com.amazonaws.codesamples;

import java.util.Set;

import software.amazon.dynamodb.datamodeling.DynamoDBAttribute;
import software.amazon.dynamodb.datamodeling.DynamoDBHashKey;
import software.amazon.dynamodb.datamodeling.DynamoDBIgnore;
import software.amazon.dynamodb.datamodeling.DynamoDBTable;

@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {

    private Integer id;
    private String title;
    private String ISBN;
    private Set<String> bookAuthors;
    private String someProp;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer id) {this.id = id; }

    @DynamoDBAttribute(attributeName="Title")
    public String getTitle() {return title; }
    public void setTitle(String title) { this.title = title; }

    @DynamoDBAttribute(attributeName="ISBN")
    public String getISBN() { return ISBN; }
    public void setISBN(String ISBN) { this.ISBN = ISBN; }

    @DynamoDBAttribute(attributeName="Authors")
    public Set<String> getBookAuthors() { return bookAuthors; }
    public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; }

    @DynamoDBIgnore
    public String getSomeProp() { return someProp; }
    public void setSomeProp(String someProp) { this.someProp = someProp; }
}
```

Nel codice precedente, l'annotazione `@DynamoDBTable` mappa la classe `CatalogItem` alla tabella `ProductCatalog`. Puoi archiviare istanze di classi individuali come item della tabella. Nella definizione della classe, l'annotazione `@DynamoDBHashKey` mappa la proprietà `Id` alla chiave primaria. 

Per impostazione predefinita, le proprietà di classe si mappano agli stessi attributi dei nomi della tabella. Le proprietà `Title` e `ISBN` si mappano agli stessi attributi dei nomi della tabella. 

L'annotazione `@DynamoDBAttribute` è facoltativa quando il nome dell'attributo DynamoDB corrisponde al nome della proprietà dichiarata nella classe. Quando questi sono differenti, utilizza questa annotazione con il parametro `attributeName` in modo da specificare a quale attributo DynamoDB corrisponde questa proprietà. 

Nell’esempio precedente, l’annotazione `@DynamoDBAttribute` viene aggiunta a ogni proprietà per garantire che i nomi della proprietà corrispondano esattamente alle tabelle create in una fase precedente e che sia coerente con i nomi di attributo utilizzati in altri esempi di codice in questa guida. 

La definizione della classe può avere proprietà che non si mappano ad alcun attributo della tabella. Identifica queste proprietà aggiungendo l'annotazione `@DynamoDBIgnore`. Nell'esempio precedente, la proprietà `SomeProp` viene contrassegnata con l'annotazione `@DynamoDBIgnore`. Quando carichi nella tabella l'istanza `CatalogItem`, l'istanza `DynamoDBMapper` non include la proprietà `SomeProp`. Inoltre, il mappatore non restituisce questo attributo quando recuperi un item dalla tabella. 

Dopo aver definito la classe di mappatura, puoi utilizzare i metodi `DynamoDBMapper` per scrivere un'istanza di tale classe in un item corrispondente nella tabella `Catalog`. Il seguente esempio di codice dimostra questa tecnica.

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDBMapper mapper = new DynamoDBMapper(client);

CatalogItem item = new CatalogItem();
item.setId(102);
item.setTitle("Book 102 Title");
item.setISBN("222-2222222222");
item.setBookAuthors(new HashSet<String>(Arrays.asList("Author 1", "Author 2")));
item.setSomeProp("Test");

mapper.save(item);
```

Il seguente esempio di codice mostra come recuperare l'item e accedere ad alcuni dei suoi attributi:

```
CatalogItem partitionKey = new CatalogItem();

partitionKey.setId(102);
DynamoDBQueryExpression<CatalogItem> queryExpression = new DynamoDBQueryExpression<CatalogItem>()
    .withHashKeyValues(partitionKey);

List<CatalogItem> itemList = mapper.query(CatalogItem.class, queryExpression);

for (int i = 0; i < itemList.size(); i++) {
    System.out.println(itemList.get(i).getTitle());
    System.out.println(itemList.get(i).getBookAuthors());
}
```

`DynamoDBMapper` offre un modo intuitivo e naturale di lavorare con i dati di DynamoDB all'interno di Java. Fornisce inoltre diverse caratteristiche integrate, come il blocco ottimistico, transazioni ACID, valori di chiavi di partizione e di ordinamento generati automaticamente e la funzione Versioni multiple degli oggetti.

# Classe Dynamo DBMapper
<a name="DynamoDBMapper.Methods"></a>



La classe `DynamoDBMapper` è il punto di ingresso al database Amazon DynamoDB. Fornisce l'accesso a un endpoint DynamoDB e consente di accedere ai dati in diverse tabelle. Consente anche di eseguire diverse operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD) sugli elementi e di eseguire query e scansioni sulle tabelle. Questa classe fornisce i metodi seguenti per lavorare con DynamoDB.

[https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html)

**Topics**
+ [save](#DynamoDBMapper.Methods.save)
+ [caricare](#DynamoDBMapper.Methods.load)
+ [Elimina](#DynamoDBMapper.Methods.delete)
+ [query](#DynamoDBMapper.Methods.query)
+ [queryPage](#DynamoDBMapper.Methods.queryPage)
+ [scan](#DynamoDBMapper.Methods.scan)
+ [scanPage](#DynamoDBMapper.Methods.scanPage)
+ [parallelScan](#DynamoDBMapper.Methods.parallelScan)
+ [batchSave](#DynamoDBMapper.Methods.batchSave)
+ [batchLoad](#DynamoDBMapper.Methods.batchLoad)
+ [batchDelete](#DynamoDBMapper.Methods.batchDelete)
+ [BatchWrite](#DynamoDBMapper.Methods.batchWrite)
+ [transactionWrite](#DynamoDBMapper.Methods.transactionWrite)
+ [transactionLoad](#DynamoDBMapper.Methods.transactionLoad)
+ [count](#DynamoDBMapper.Methods.count)
+ [generateCreateTableRichiesta](#DynamoDBMapper.Methods.generateCreateTableRequest)
+ [createS3Link](#DynamoDBMapper.Methods.createS3Link)
+ [ottiene S3 ClientCache](#DynamoDBMapper.Methods.getS3ClientCache)

## save
<a name="DynamoDBMapper.Methods.save"></a>

Salva l'oggetto specificato nella tabella. L'oggetto che intendi salvare è l'unico parametro obbligatorio di questo metodo. Puoi fornire parametri di configurazione opzionali utilizzando l'oggetto `DynamoDBMapperConfig`. 

Se non esiste un item avente la stessa chiave primaria, questo metodo crea un nuovo item nella tabella. Se esiste un item avente la stessa chiave primaria, esso aggiorna l'item esistente. Se la chiave di partizione e la chiave di ordinamento sono del tipo String e sono annotate con `@DynamoDBAutoGeneratedKey`, viene loro assegnato un identificatore unico universale casuale (UUID) in caso di mancata inizializzazione. I campi di versione annotati con `@DynamoDBVersionAttribute` vengono incrementati di una unità. Inoltre, se viene aggiornato un campo di versione o viene generata una chiave, l'oggetto passato si aggiornerà a seguito dell'operazione. 

Per impostazione predefinita, solo gli attributi corrispondenti alle proprietà della classe mappate vengono aggiornati. Glie eventuali attributi esistenti aggiuntivi su un item non sono interessati. Tuttavia, se specifichi `SaveBehavior.CLOBBER`, puoi forzare la sovrascrittura completa dell'item.

```
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder()
    .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER).build();
        
mapper.save(item, config);
```

Se la funzione Versioni multiple è abilitata, le versioni dell'item lato client e lato server devono corrispondere. Tuttavia, non è necessario che la versione corrisponda se viene utilizzata l'opzione `SaveBehavior.CLOBBER`. Per ulteriori informazioni sulla funzione Controllo delle versioni, consulta [DynamoDB e blocco ottimistico con il numero di versione](DynamoDBMapper.OptimisticLocking.md).

## caricare
<a name="DynamoDBMapper.Methods.load"></a>

Recupera un item da una tabella. È necessario fornire la chiave primaria dell'item che intendi recuperare. Puoi fornire parametri di configurazione opzionali utilizzando l'oggetto `DynamoDBMapperConfig`. Ad esempio, puoi richiedere facoltativamente letture fortemente consistenti per garantire che questo metodo recuperi solo i valori di item più recenti, come riportato nella seguente dichiarazione Java. 

```
DynamoDBMapperConfig config = DynamoDBMapperConfig.builder()
    .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT).build();

CatalogItem item = mapper.load(CatalogItem.class, item.getId(), config);
```

Per impostazione predefinita, DynamoDB restituisce l'elemento che dispone di valori con consistenza finale. Per informazioni sul modello di consistenza finale di DynamoDB, consulta [Coerenza di lettura di DynamoDB](HowItWorks.ReadConsistency.md).

## Elimina
<a name="DynamoDBMapper.Methods.delete"></a>

Elimina un item dalla tabella. È necessario passare un'istanza di oggetto della classe mappata. 

Se la funzione Versioni multiple è abilitata, le versioni dell'item lato client e lato server devono corrispondere. Tuttavia, non è necessario che la versione corrisponda se viene utilizzata l'opzione `SaveBehavior.CLOBBER`. Per ulteriori informazioni sulla funzione Controllo delle versioni, consulta [DynamoDB e blocco ottimistico con il numero di versione](DynamoDBMapper.OptimisticLocking.md). 

## query
<a name="DynamoDBMapper.Methods.query"></a>

Esegue una query su una tabella o un indice secondario.

Supponiamo che tu abbia una tabella, `Reply`, in cui vengono memorizzate le risposte dei thread di un forum. Ogni tema del thread può contenere 0 o più risposte. La chiave primaria della tabella `Reply` è costituita dai campi `Id` e `ReplyDateTime`, in cui l'`Id` è la chiave di partizione, mentre `ReplyDateTime` è la chiave di ordinamento della chiave primaria.

```
Reply ( Id, ReplyDateTime, ... )
```

Si supponga ora di aver creato una mappatura tra la classe `Reply` e la tabella `Reply` corrispondente in DynamoDB. Il seguente codice Java utilizza `DynamoDBMapper` per trovare tutte le risposte delle due settimane precedenti di uno specifico tema di un thread.

**Example**  

```
String forumName = "&DDB;";
String forumSubject = "&DDB; Thread 1";
String partitionKey = forumName + "#" + forumSubject;

long twoWeeksAgoMilli = (new Date()).getTime() - (14L*24L*60L*60L*1000L);
Date twoWeeksAgo = new Date();
twoWeeksAgo.setTime(twoWeeksAgoMilli);
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String twoWeeksAgoStr = df.format(twoWeeksAgo);

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1", new AttributeValue().withS(partitionKey));
eav.put(":v2",new AttributeValue().withS(twoWeeksAgoStr.toString()));

DynamoDBQueryExpression<Reply> queryExpression = new DynamoDBQueryExpression<Reply>()
    .withKeyConditionExpression("Id = :v1 and ReplyDateTime > :v2")
    .withExpressionAttributeValues(eav);

List<Reply> latestReplies = mapper.query(Reply.class, queryExpression);
```

La query restituisce una raccolta di oggetti `Reply`. 

Per impostazione predefinita, il metodo `query` restituisce una raccolta a "caricamento differito". Inizialmente restituisce solo una pagina di risultati e in seguito effettua una chiamata di assistenza per la pagina successiva, se necessario. Per ottenere tutti gli elementi corrispondenti, eseguire iterazioni sulla raccolta `latestReplies`. 

Tieni presente che la chiamata del metodo `size()` sulla raccolta carica tutti i risultati al fine di fornire un conteggio accurato. Di conseguenza si potrebbe verificare un consumo eccessivo di throughput assegnato e nel caso di una tabella molto grande potrebbe persino esaurirsi tutta la memoria nella JVM.

Per eseguire query a un indice, è necessario in primo luogo modellarlo come classe di mappatore. *Supponiamo che la `Reply` tabella abbia un indice secondario globale denominato -Message-Index. PostedBy* La chiave di partizione di quest'indice è `PostedBy`, mentre la chiave di ordinamento è `Message`. La definizione di classe di un item dell'indice dovrebbe avere un aspetto simile al seguente:

```
@DynamoDBTable(tableName="Reply")
public class PostedByMessage {
    private String postedBy;
    private String message;

    @DynamoDBIndexHashKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "PostedBy")
    public String getPostedBy() { return postedBy; }
    public void setPostedBy(String postedBy) { this.postedBy = postedBy; }

    @DynamoDBIndexRangeKey(globalSecondaryIndexName = "PostedBy-Message-Index", attributeName = "Message")
    public String getMessage() { return message; }
    public void setMessage(String message) { this.message = message; }

   // Additional properties go here.
}
```

L'annotazione `@DynamoDBTable` indica che questo indice è associato alla tabella `Reply`. *L'`@DynamoDBIndexHashKey`annotazione indica la chiave di partizione (*PostedBy*) dell'indice e `@DynamoDBIndexRangeKey` indica la chiave di ordinamento (Message) dell'indice.*

Puoi ora utilizzare `DynamoDBMapper` per eseguire query all'indice, recuperando un sottoinsieme di messaggi pubblicati da un determinato utente. Non è necessario specificare il nome dell'indice se non sono presenti mappature in conflitto tra tabelle e indici e le mappature sono già state eseguite nel mappatore. Il mappatore deciderà in base alla chiave primaria e alla chiave di ordinamento. Il codice seguente esegue una query su un indice secondario globale. Poiché gli indici secondari globali supportano letture consistenti finali, ma non letture consistenti, è necessario specificare `withConsistentRead(false)`.

```
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1",  new AttributeValue().withS("User A"));
eav.put(":v2",  new AttributeValue().withS("DynamoDB"));

DynamoDBQueryExpression<PostedByMessage> queryExpression = new DynamoDBQueryExpression<PostedByMessage>()
    .withIndexName("PostedBy-Message-Index")
    .withConsistentRead(false)
    .withKeyConditionExpression("PostedBy = :v1 and begins_with(Message, :v2)")
    .withExpressionAttributeValues(eav);

List<PostedByMessage> iList =  mapper.query(PostedByMessage.class, queryExpression);
```

La query restituisce una raccolta di oggetti `PostedByMessage`.

## queryPage
<a name="DynamoDBMapper.Methods.queryPage"></a>

Esegue query su una tabella o un indice secondario e restituisce una singola pagina di risultati corrispondenti. Come per il metodo `query`, è necessario specificare il valore di una chiave di partizione e un filtro query applicato all'attributo della chiave di ordinamento. Tuttavia, `queryPage` restituisce solo la prima "pagina" di dati, ovvero la quantità di dati che rientra in 1 MB. 

## scan
<a name="DynamoDBMapper.Methods.scan"></a>

Esegue la scansione di un'intera tabella o di un indice secondario. Puoi specificare facoltativamente `FilterExpression` per filtrare il set di risultati.

Supponiamo che tu abbia una tabella, `Reply`, in cui vengono memorizzate le risposte dei thread di un forum. Ogni tema del thread può contenere 0 o più risposte. La chiave primaria della tabella `Reply` è costituita dai campi `Id` e `ReplyDateTime`, in cui l'`Id` è la chiave di partizione, mentre `ReplyDateTime` è la chiave di ordinamento della chiave primaria.

```
Reply ( Id, ReplyDateTime, ... )
```

Se hai mappato una classe Java alla tabella `Reply`, puoi utilizzare la `DynamoDBMapper` per eseguire la scansione della tabella. Ad esempio, il seguente codice Java esegue la scansione dell'intera tabella `Reply`, restituendo solo le risposte di un determinato anno.

**Example**  

```
HashMap<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":v1", new AttributeValue().withS("2015"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withFilterExpression("begins_with(ReplyDateTime,:v1)")
    .withExpressionAttributeValues(eav);

List<Reply> replies =  mapper.scan(Reply.class, scanExpression);
```

Per impostazione predefinita, il metodo `scan` restituisce una raccolta a "caricamento differito". Inizialmente restituisce solo una pagina di risultati e in seguito effettua una chiamata di assistenza per la pagina successiva, se necessario. Per ottenere tutti gli elementi corrispondenti, eseguire iterazioni sulla raccolta `replies`.

Tieni presente che la chiamata del metodo `size()` sulla raccolta carica tutti i risultati al fine di fornire un conteggio accurato. Di conseguenza si potrebbe verificare un consumo eccessivo di throughput assegnato e nel caso di una tabella molto grande potrebbe persino esaurirsi tutta la memoria nella JVM.

Per eseguire la scansione di un indice, è necessario in primo luogo modellarlo come classe di mappatore. Supponiamo che la tabella `Reply` abbia un indice secondario globale denominato `PostedBy-Message-Index`. La chiave di partizione di quest'indice è `PostedBy`, mentre la chiave di ordinamento è `Message`. Una classe di mappatore per questo indice viene mostrata nella sezione [query](#DynamoDBMapper.Methods.query). Utilizza le annotazioni `@DynamoDBIndexHashKey` e `@DynamoDBIndexRangeKey` per specificare la chiave di partizione e la chiave di ordinamento dell'indice.

L'esempio di codice seguente esegue la scansione di `PostedBy-Message-Index`. Esso non utilizza un filtro di scansione, così che ti vengano restituiti tutti gli elementi dell'indice.

```
DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withIndexName("PostedBy-Message-Index")
    .withConsistentRead(false);

    List<PostedByMessage> iList =  mapper.scan(PostedByMessage.class, scanExpression);
    Iterator<PostedByMessage> indexItems = iList.iterator();
```

## scanPage
<a name="DynamoDBMapper.Methods.scanPage"></a>

Esegue una scansione su una tabella o un indice secondario e restituisce una singola pagina di risultati corrispondenti. Come per il metodo `scan`, puoi specificare facoltativamente `FilterExpression` per filtrare il set di risultati. Tuttavia, `scanPage` restituisce solo la prima "pagina" di dati, ovvero la quantità di dati che rientra in 1 MB.

## parallelScan
<a name="DynamoDBMapper.Methods.parallelScan"></a>

Esegue una scansione parallela di un'intera tabella o di un indice secondario. Puoi specificare una serie di segmenti logici della tabella e un'espressione scan per filtrare i risultati. `parallelScan` divide l'attività di scansione tra più dipendenti, uno per ogni segmento logico; i dipendenti elaborano i dati in parallelo e restituiscono i risultati.

L'esempio di codice Java seguente esegue una scansione parallela sulla tabella `Product`.

```
int numberOfThreads = 4;

Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
eav.put(":n", new AttributeValue().withN("100"));

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression()
    .withFilterExpression("Price <= :n")
    .withExpressionAttributeValues(eav);

List<Product> scanResult = mapper.parallelScan(Product.class, scanExpression, numberOfThreads);
```

## batchSave
<a name="DynamoDBMapper.Methods.batchSave"></a>

Salva gli oggetti in una o più tabelle tramite una o più chiamate al metodo `AmazonDynamoDB.batchWriteItem`. Questo metodo non fornisce garanzie sulle transazioni.

Il codice Java seguente salva due item (libri) nella tabella `ProductCatalog`.

```
Book book1 = new Book();
book1.setId(901);
book1.setProductCategory("Book");
book1.setTitle("Book 901 Title");

Book book2 = new Book();
book2.setId(902);
book2.setProductCategory("Book");
book2.setTitle("Book 902 Title");

mapper.batchSave(Arrays.asList(book1, book2));
```

## batchLoad
<a name="DynamoDBMapper.Methods.batchLoad"></a>

Recupera più item da una o più tabelle utilizzando la loro chiave primaria.

Il seguente codice Java recupera due item da due tabelle differenti.

```
ArrayList<Object> itemsToGet = new ArrayList<Object>();

ForumItem forumItem = new ForumItem();
forumItem.setForumName("Amazon DynamoDB");
itemsToGet.add(forumItem);

ThreadItem threadItem = new ThreadItem();
threadItem.setForumName("Amazon DynamoDB");
threadItem.setSubject("Amazon DynamoDB thread 1 message text");
itemsToGet.add(threadItem);

Map<String, List<Object>> items = mapper.batchLoad(itemsToGet);
```

## batchDelete
<a name="DynamoDBMapper.Methods.batchDelete"></a>

Elimina gli oggetti da una o più tabelle tramite una o più chiamate al metodo `AmazonDynamoDB.batchWriteItem`. Questo metodo non fornisce garanzie sulle transazioni. 

Il seguente codice Java elimina due item (libri) dalla tabella `ProductCatalog`.

```
Book book1 = mapper.load(Book.class, 901);
Book book2 = mapper.load(Book.class, 902);
mapper.batchDelete(Arrays.asList(book1, book2));
```

## BatchWrite
<a name="DynamoDBMapper.Methods.batchWrite"></a>

Salva gli oggetti o li elimina da una o più tabelle tramite una o più chiamate al metodo `AmazonDynamoDB.batchWriteItem`. Questo metodo non fornisce garanzie sulle transazioni né supporta la funzione Versioni multiple (inserimenti o eliminazioni condizionali).

Il seguente frammento di codice Java scrive un nuovo item nella tabella `Forum`, scrive un nuovo item nella tabella `Thread` ed elimina un item dalla tabella `ProductCatalog`.

```
// Create a Forum item to save
Forum forumItem = new Forum();
forumItem.setName("Test BatchWrite Forum");

// Create a Thread item to save
Thread threadItem = new Thread();
threadItem.setForumName("AmazonDynamoDB");
threadItem.setSubject("My sample question");

// Load a ProductCatalog item to delete
Book book3 = mapper.load(Book.class, 903);

List<Object> objectsToWrite = Arrays.asList(forumItem, threadItem);
List<Book> objectsToDelete = Arrays.asList(book3);

mapper.batchWrite(objectsToWrite, objectsToDelete);
```

## transactionWrite
<a name="DynamoDBMapper.Methods.transactionWrite"></a>

Salva gli oggetti o li elimina da una o più tabelle tramite una o più chiamate al metodo `AmazonDynamoDB.transactWriteItems`. 

[Per un elenco delle eccezioni specifiche delle transazioni, consulta errori. TransactWriteItems ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html#API_TransactWriteItems_Errors) 

Per ulteriori informazioni sulle transazioni DynamoDB e le garanzie ACID (Atomicity, Consistency, Isolation and Durability) fornite, consulta [Amazon DynamoDB Transactions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

**Nota**  
 Questo metodo non supporta i seguenti metodi:  
[Dynamo ConfigDBMapper. SaveBehavior](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptionalConfig.html).

Il seguente codice Java scrive un nuovo item in ogni tabella `Forum` e `Thread`, a livello di transazione.

```
Thread s3ForumThread = new Thread();
s3ForumThread.setForumName("S3 Forum");
s3ForumThread.setSubject("Sample Subject 1");
s3ForumThread.setMessage("Sample Question 1");

Forum s3Forum = new Forum();
s3Forum.setName("S3 Forum");
s3Forum.setCategory("Amazon Web Services");
s3Forum.setThreads(1);

TransactionWriteRequest transactionWriteRequest = new TransactionWriteRequest();
transactionWriteRequest.addPut(s3Forum);
transactionWriteRequest.addPut(s3ForumThread);
mapper.transactionWrite(transactionWriteRequest);
```

## transactionLoad
<a name="DynamoDBMapper.Methods.transactionLoad"></a>

Carica gli oggetti da una o più tabelle tramite una chiamata al metodo `AmazonDynamoDB.transactGetItems`. 

[Per un elenco delle eccezioni specifiche delle transazioni, consulta errori. TransactGetItems ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html#API_TransactGetItems_Errors) 

Per ulteriori informazioni sulle transazioni DynamoDB e le garanzie ACID (Atomicity, Consistency, Isolation and Durability) fornite, consulta [Amazon DynamoDB Transactions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

Il seguente codice Java carica un elemento da ciascuna delle tabelle `Forum` e `Thread`, a livello di transazione.

```
Forum dynamodbForum = new Forum();
dynamodbForum.setName("DynamoDB Forum");
Thread dynamodbForumThread = new Thread();
dynamodbForumThread.setForumName("DynamoDB Forum");

TransactionLoadRequest transactionLoadRequest = new TransactionLoadRequest();
transactionLoadRequest.addLoad(dynamodbForum);
transactionLoadRequest.addLoad(dynamodbForumThread);
mapper.transactionLoad(transactionLoadRequest);
```

## count
<a name="DynamoDBMapper.Methods.count"></a>

Valuta l'espressione scan specificata e restituisce il numero di item corrispondenti. Non viene restituito alcun dato di item.

## generateCreateTableRichiesta
<a name="DynamoDBMapper.Methods.generateCreateTableRequest"></a>

Analizza una classe POJO che rappresenta una tabella DynamoDB e restituisce un `CreateTableRequest` per tale tabella.

## createS3Link
<a name="DynamoDBMapper.Methods.createS3Link"></a>

Crea un collegamento a un oggetto in Amazon S3. È necessario specificare un nome del bucket e un nome della chiave, il quale identifica l'oggetto nel bucket in modo univoco.

Per utilizzare `createS3Link`, la classe di mappatore deve definire metodi getter e setter. Il seguente esempio di codice lo illustra aggiungendo un nuovo attributo e nuovi getter/setter metodi alla `CatalogItem` classe.

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {

    ...

    public S3Link productImage;

    ....

    @DynamoDBAttribute(attributeName = "ProductImage")
    public S3Link getProductImage() {
            return productImage;
    }

    public void setProductImage(S3Link productImage) {
        this.productImage = productImage;
    }

...
}
```

Il seguente frammento di codice Java definisce un nuovo item da scrivere nella tabella `Product`. Questo elemento include un collegamento all'immagine del prodotto; i dati relativi all'immagine vengono caricati in Amazon S3.

```
CatalogItem item = new CatalogItem();

item.setId(150);
item.setTitle("Book 150 Title");

String amzn-s3-demo-bucket = "amzn-s3-demo-bucket";
String myS3Key = "productImages/book_150_cover.jpg";
item.setProductImage(mapper.createS3Link(amzn-s3-demo-bucket, myS3Key));

item.getProductImage().uploadFrom(new File("/file/path/book_150_cover.jpg"));

mapper.save(item);
```

La classe `S3Link` fornisce molti altri metodi per manipolare gli oggetti in Amazon S3. Per ulteriori informazioni, vedi la sezione relativa a [Javadocs per `S3Link`](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/S3Link.html).

## ottiene S3 ClientCache
<a name="DynamoDBMapper.Methods.getS3ClientCache"></a>

Restituisce `S3ClientCache` sottostante per accedere ad Amazon S3. Una `S3ClientCache` è una mappa intelligente per gli oggetti `AmazonS3Client`. Se hai più clienti, An `S3ClientCache` può aiutarti a mantenere i clienti organizzati per AWS regione e può creare nuovi client Amazon S3 su richiesta.

# Tipi di dati supportati per Dynamo for Java DBMapper
<a name="DynamoDBMapper.DataTypes"></a>

In questa sezione vengono descritti i tipi di dati Java primitivi, le raccolte e i tipi di dati arbitrari supportati in Amazon DynamoDB. 

Amazon DynamoDB supporta i seguenti tipi di dati Java primitivi e classi wrapper primitive. 
+ `String`
+ `Boolean`, `boolean`
+ `Byte`, `byte`
+ `Date` (come stringa con precisione pari al millisecondo [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601), convertita in UTC)
+ `Calendar` (come stringa con precisione pari al millisecondo [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601), convertita in UTC)
+ `Long`, `long`
+ `Integer`, `int`
+ `Double`, `double`
+ `Float`, `float`
+ `BigDecimal`
+ `BigInteger`

**Nota**  
Per ulteriori informazioni sulle regole di denominazione di DynamoDB e i vari tipi di dati supportati, consulta [Tipi di dati e regole di denominazione supportati in Amazon DynamoDB](HowItWorks.NamingRulesDataTypes.md). 
I valori binari vuoti sono supportati da Dynamo. DBMapper
I valori String vuoti sono supportati da AWS SDK for Java 2.x.  
In AWS SDK for Java 1.x, DBMapper Dynamo supporta la lettura di valori di attributi String vuoti, tuttavia non scriverà valori di attributi String vuoti perché questi attributi vengono eliminati dalla richiesta.

DynamoDB supporta i tipi di raccolta Java [Set](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html), [List](http://docs.oracle.com/javase/6/docs/api/java/util/List.html) e [Map](http://docs.oracle.com/javase/6/docs/api/java/util/Map.html). La tabella seguente riassume il modo in cui questi tipi Java vengono mappati ai tipi DynamoDB.


****  

| Tipo di Java | Tipo DynamoDB | 
| --- | --- | 
|  Tutti i tipi di numeri  |  `N` (tipo numero)  | 
|  Stringhe  |  `S` (tipo stringa)   | 
|  Booleano  |  `BOOL` (Tipo booleano), 0 o 1.  | 
|  ByteBuffer  |  `B` (tipo binario)  | 
|  Data  |  `S` (tipo stringa). I valori Date vengono archiviati come stringhe in formato ISO-8601.  | 
| Tipi di raccolta [Set](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html) |  `SS` tipo (set di stringhe), `NS` tipo (set di numeri) o `BS` tipo (set binario).  | 

 L'interfaccia `DynamoDBTypeConverter` consente di mappare i propri tipi di dati arbitrari a un tipo di dati supportato in nativo da DynamoDB. Per ulteriori informazioni, consulta [Mappatura dei dati arbitrari in DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md). 

# Annotazioni Java per DynamoDB
<a name="DynamoDBMapper.Annotations"></a>

In questa sezione vengono descritte le annotazioni disponibili per la mappatura delle classi e delle proprietà alle tabelle e agli attributi in Amazon DynamoDB.

Per la documentazione Javadoc corrispondente, consulta [Riepilogo dei tipi di annotazioni](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/package-summary.html) nella [Documentazione di riferimento delle API di AWS SDK per Java](https://docs.aws.amazon.com/sdk-for-java/latest/reference/).

**Nota**  
Nelle seguenti annotazioni, sono obbligatori solo `DynamoDBTable` e `DynamoDBHashKey`. 

**Topics**
+ [Dinamo DBAttribute](#DynamoDBMapper.Annotations.DynamoDBAttribute)
+ [Dinamo DBAuto GeneratedKey](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey)
+ [Dinamo DBAuto GeneratedTimestamp](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp)
+ [Dinamo DBDocument](#DynamoDBMapper.Annotations.DynamoDBDocument)
+ [Chiave Dynamo DBHash](#DynamoDBMapper.Annotations.DynamoDBHashKey)
+ [Dinamo DBIgnore](#DynamoDBMapper.Annotations.DynamoDBIgnore)
+ [Dinamo DBIndex HashKey](#DynamoDBMapper.Annotations.DynamoDBIndexHashKey)
+ [Dinamo DBIndex RangeKey](#DynamoDBMapper.Annotations.DynamoDBIndexRangeKey)
+ [Chiave Dynamo DBRange](#DynamoDBMapper.Annotations.DynamoDBRangeKey)
+ [Dinamo DBTable](#DynamoDBMapper.Annotations.DynamoDBTable)
+ [Dinamo convertita DBType](#DynamoDBMapper.Annotations.DynamoDBTypeConverted)
+ [Dinamo DBTyped](#DynamoDBMapper.Annotations.DynamoDBTyped)
+ [Attributo Dynamo DBVersion](#DynamoDBMapper.Annotations.DynamoDBVersionAttribute)

## Dinamo DBAttribute
<a name="DynamoDBMapper.Annotations.DynamoDBAttribute"></a>

Mappa una proprietà all'attributo della tabella. Per impostazione predefinita, ogni proprietà di classe si mappa a un attributo item con lo stesso nome. Tuttavia, se i nomi non sono gli stessi, puoi utilizzare questa annotazione per mappare una proprietà all'attributo. Nel frammento Java seguente, `DynamoDBAttribute` mappa la proprietà `BookAuthors` al nome di attributo `Authors` della tabella.

```
@DynamoDBAttribute(attributeName = "Authors")
public List<String> getBookAuthors() { return BookAuthors; }
public void setBookAuthors(List<String> BookAuthors) { this.BookAuthors = BookAuthors; }
```

`DynamoDBMapper` utilizza `Authors` come nome di attributo quando salva l'oggetto nella tabella. 

## Dinamo DBAuto GeneratedKey
<a name="DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey"></a>

Contrassegna una proprietà di chiave di partizione o di ordinamento come generata automaticamente. `DynamoDBMapper` genera un [UUID](http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html) casuale durante il salvataggio di questi attributi. Solo le proprietà String possono essere contrassegnate come chiavi generate automaticamente. 

L'esempio seguente illustra l'utilizzo delle chiavi generate automaticamente.

```
@DynamoDBTable(tableName="AutoGeneratedKeysExample")
public class AutoGeneratedKeys {
    private String id;
    private String payload;

    @DynamoDBHashKey(attributeName = "Id")
    @DynamoDBAutoGeneratedKey
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }

    @DynamoDBAttribute(attributeName="payload")
    public String getPayload() { return this.payload; }
    public void setPayload(String payload) { this.payload = payload; }

    public static void saveItem() {
        AutoGeneratedKeys obj = new AutoGeneratedKeys();
        obj.setPayload("abc123");

        // id field is null at this point
        DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);
        mapper.save(obj);

        System.out.println("Object was saved with id " + obj.getId());
    }
}
```

## Dinamo DBAuto GeneratedTimestamp
<a name="DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp"></a>

Genera automaticamente un timestamp.

```
@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS)
public Date getLastUpdatedDate() { return lastUpdatedDate; }
public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }
```

Facoltativamente, la strategia di generazione automatica può essere definita fornendo un attributo di strategia. Il valore predefinito è `ALWAYS`.

## Dinamo DBDocument
<a name="DynamoDBMapper.Annotations.DynamoDBDocument"></a>

Indica che una classe può essere serializzata come un documento di Amazon DynamoDB.

Ad esempio, si supponga di voler mappare un documento JSON a un attributo DynamoDB di tipo Map (`M`). Il seguente esempio di codice definisce un item contenente un attributo nidificato (Pictures) di tipo Map.

```
public class ProductCatalogItem {

    private Integer id;  //partition key
    private Pictures pictures;
    /* ...other attributes omitted... */

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    @DynamoDBAttribute(attributeName="Pictures")
    public Pictures getPictures() { return pictures;}
    public void setPictures(Pictures pictures) {this.pictures = pictures;}

    // Additional properties go here.

    @DynamoDBDocument
    public static class Pictures {
        private String frontView;
        private String rearView;
        private String sideView;

        @DynamoDBAttribute(attributeName = "FrontView")
        public String getFrontView() { return frontView; }
        public void setFrontView(String frontView) { this.frontView = frontView; }

        @DynamoDBAttribute(attributeName = "RearView")
        public String getRearView() { return rearView; }
        public void setRearView(String rearView) { this.rearView = rearView; }

        @DynamoDBAttribute(attributeName = "SideView")
        public String getSideView() { return sideView; }
        public void setSideView(String sideView) { this.sideView = sideView; }

     }
}
```

Puoi quindi salvare un nuovo item `ProductCatalog`, con `Pictures`, come mostrato nell'esempio seguente.

```
ProductCatalogItem item = new ProductCatalogItem();

Pictures pix = new Pictures();
pix.setFrontView("http://example.com/products/123_front.jpg");
pix.setRearView("http://example.com/products/123_rear.jpg");
pix.setSideView("http://example.com/products/123_left_side.jpg");
item.setPictures(pix);

item.setId(123);

mapper.save(item);
```

L'aspetto dell'item `ProductCatalog` risultante dovrebbe essere simile al seguente (in formato JSON).

```
{
  "Id" : 123
  "Pictures" : {
    "SideView" : "http://example.com/products/123_left_side.jpg",
    "RearView" : "http://example.com/products/123_rear.jpg",
    "FrontView" : "http://example.com/products/123_front.jpg"
  }
}
```

## Chiave Dynamo DBHash
<a name="DynamoDBMapper.Annotations.DynamoDBHashKey"></a>

Mappa una proprietà di classe alla chiave di partizione della tabella. La proprietà deve essere uno dei tipi di stringa, numero o binario scalari. La proprietà non può essere un tipo di raccolta. 

Supponi di avere una tabella, `ProductCatalog`, che abbia come chiave primaria l'`Id`. Il seguente codice Java definisce una classe `CatalogItem` e mappa la sua proprietà `Id` alla chiave primaria della tabella `ProductCatalog` utilizzando il tag `@DynamoDBHashKey`.

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
    private Integer Id;
   @DynamoDBHashKey(attributeName="Id")
   public Integer getId() {
        return Id;
   }
   public void setId(Integer Id) {
        this.Id = Id;
   }
   // Additional properties go here.
}
```

## Dinamo DBIgnore
<a name="DynamoDBMapper.Annotations.DynamoDBIgnore"></a>

Indica all'istanza `DynamoDBMapper` che la proprietà associata deve essere ignorata. Quando salvi i dati nella tabella, `DynamoDBMapper` non salva questa proprietà nella tabella.

 Applicato al metodo getter o al campo della classe per una proprietà non modellata. Se l'annotazione viene applicata direttamente al campo della classe, il getter e il setter corrispondenti devono essere dichiarati nella stessa classe. 

## Dinamo DBIndex HashKey
<a name="DynamoDBMapper.Annotations.DynamoDBIndexHashKey"></a>

Mappa una proprietà di classe alla chiave di partizione di un indice secondario globale. La proprietà deve essere uno dei tipi di stringa, numero o binario scalari. La proprietà non può essere un tipo di raccolta. 

Utilizza questa annotazione se è necessario eseguire una `Query` su un indice secondario globale. È necessario specificare il nome dell'indice (`globalSecondaryIndexName`). Se il nome della proprietà di classe è diverso dalla chiave di partizione dell'indice, è necessario inoltre specificare il nome di tale attributo dell'indice (`attributeName`).

## Dinamo DBIndex RangeKey
<a name="DynamoDBMapper.Annotations.DynamoDBIndexRangeKey"></a>

Associa una proprietà di classe alla chiave di ordinamento di un indice secondario globale o di un indice secondario locale. La proprietà deve essere uno dei tipi di stringa, numero o binario scalari. La proprietà non può essere un tipo di raccolta. 

Utilizza questa annotazione se è necessario eseguire una `Query` su un indice secondario locale o globale e si desidera rifinire i risultati utilizzando la chiave di ordinamento dell'indice. È necessario specificare il nome dell'indice (`globalSecondaryIndexName`, oppure `localSecondaryIndexName`). Se il nome della proprietà di classe è diverso dalla chiave di ordinamento dell'indice, è necessario inoltre specificare il nome di tale attributo dell'indice (`attributeName`).

## Chiave Dynamo DBRange
<a name="DynamoDBMapper.Annotations.DynamoDBRangeKey"></a>

Mappa una proprietà di classe alla chiave di ordinamento della tabella. La proprietà deve essere uno dei tipi di stringa, numero o binario scalari. Non può essere un tipo di raccolta. 

Se la chiave primaria è composita (chiave di partizione e chiave di ordinamento), puoi utilizzare questo tag per mappare il campo della classe alla chiave di ordinamento. Ad esempio, supponiamo che tu abbia una tabella `Reply` in cui vengono memorizzate le risposte dei thread di un forum. Ogni thread può contenere molte risposte. Pertanto, la chiave primaria di questa tabella è sia `ThreadId` sia `ReplyDateTime`. La chiave di partizione è `ThreadId` e la chiave di ordinamento è `ReplyDateTime`. 

Il seguente codice Java definisce una classe `Reply` e la mappa alla tabella `Reply`. Esso utilizza sia il tag `@DynamoDBHashKey` che `@DynamoDBRangeKey` per identificare le proprietà di classe che si mappano alla chiave primaria.

```
@DynamoDBTable(tableName="Reply")
public class Reply {
    private Integer id;
    private String replyDateTime;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @DynamoDBRangeKey(attributeName="ReplyDateTime")
    public String getReplyDateTime() { return replyDateTime; }
    public void setReplyDateTime(String replyDateTime) { this.replyDateTime = replyDateTime; }

   // Additional properties go here.
}
```

## Dinamo DBTable
<a name="DynamoDBMapper.Annotations.DynamoDBTable"></a>

Identifica la tabella di destinazione di DynamoDB. Ad esempio, il seguente codice Java definisce una classe `Developer` e la mappa alla tabella `People` in DynamoDB. 

```
@DynamoDBTable(tableName="People")
public class Developer { ...}
```

L'annotazione `@DynamoDBTable` può essere ereditata. Tutte le nuove classi che ereditano dalla classe `Developer` vengono pure mappate alla tabella `People`. Ad esempio, supponiamo che tu abbia creato una classe `Lead` che erediti dalla classe `Developer`. Poiché hai mappato la classe `Developer` alla tabella `People`, anche gli oggetti della classe `Lead` vengono memorizzati nella stessa tabella.

`@DynamoDBTable` può anche essere sovrascritto. Tutte le nuove classi che ereditano dalla classe `Developer` vengono mappate alla stessa tabella `People` per impostazione predefinita. Tuttavia, puoi sovrascrivere questa mappatura predefinita. Ad esempio, se crei una classe che eredita dalla classe `Developer`, puoi mapparla esplicitamente a un'altra tabella aggiungendo l'annotazione `@DynamoDBTable`, come riportato nel seguente esempio di codice Java.

```
@DynamoDBTable(tableName="Managers")
public class Manager extends Developer { ...}
```

## Dinamo convertita DBType
<a name="DynamoDBMapper.Annotations.DynamoDBTypeConverted"></a>

Annotazione per contrassegnare che una proprietà utilizza un convertitore di tipi personalizzato. Può essere annotata su un'annotazione definita dall'utente per passare proprietà aggiuntive a `DynamoDBTypeConverter`. 

 L'interfaccia `DynamoDBTypeConverter` consente di mappare i propri tipi di dati arbitrari a un tipo di dati supportato in nativo da DynamoDB. Per ulteriori informazioni, consulta [Mappatura dei dati arbitrari in DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md).

## Dinamo DBTyped
<a name="DynamoDBMapper.Annotations.DynamoDBTyped"></a>

Annotazione per sovrascrivere il vincolo del tipo di attributo standard. I tipi standard non richiedono l'annotazione se viene loro applicato il vincolo di attributo predefinito per quel tipo. 

## Attributo Dynamo DBVersion
<a name="DynamoDBMapper.Annotations.DynamoDBVersionAttribute"></a>

Identifica una proprietà di classe per archiviare un numero di versione di blocco ottimistico. `DynamoDBMapper` assegna un numero di versione a detta proprietà quando salva un nuovo item e lo incrementa ogni volta che lo aggiorni. Sono supportati soltanto i tipi scalari di numero. Per ulteriori informazioni sui tipi di dati, consulta [Tipi di dati](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes). Per ulteriori informazioni sulla funzione Controllo delle versioni, consulta [DynamoDB e blocco ottimistico con il numero di versione](DynamoDBMapper.OptimisticLocking.md).

# Impostazioni di configurazione opzionali per Dynamo DBMapper
<a name="DynamoDBMapper.OptionalConfig"></a>

Quando crei un'istanza di `DynamoDBMapper`, esso contiene determinati comportamenti predefiniti; puoi sovrascrivere tali impostazioni predefinite tramite la classe `DynamoDBMapperConfig`. 

Nel seguente frammento di codice viene creato un `DynamoDBMapper` con impostazioni personalizzate:

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().build();

DynamoDBMapperConfig mapperConfig = DynamoDBMapperConfig.builder()
        .withSaveBehavior(DynamoDBMapperConfig.SaveBehavior.CLOBBER)
        .withConsistentReads(DynamoDBMapperConfig.ConsistentReads.CONSISTENT)
        .withTableNameOverride(null)
        .withPaginationLoadingStrategy(DynamoDBMapperConfig.PaginationLoadingStrategy.EAGER_LOADING)
    .build();

DynamoDBMapper mapper = new DynamoDBMapper(client, mapperConfig);
```

[Per ulteriori informazioni, consulta [https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.html](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapperConfig.html) nell'API Reference.AWS SDK per Java](https://docs.aws.amazon.com/sdk-for-java/latest/reference/)

Puoi utilizzare i seguenti argomenti per un'istanza di `DynamoDBMapperConfig`:
+ Un valore di enumerazione `DynamoDBMapperConfig.ConsistentReads`:
  + `EVENTUAL`: l'istanza del mappatore utilizza una richiesta di lettura a consistenza finale.
  + `CONSISTENT`: l'istanza del mappatore utilizza una richiesta di lettura fortemente consistente. Puoi utilizzare questa impostazione opzionale con le operazioni `load`, `query` o `scan`. Le letture fortemente consistenti hanno implicazioni per le prestazioni e la fatturazione; consulta la [pagina dei dettagli del prodotto](https://aws.amazon.com/dynamodb) di DynamoDB per ulteriori informazioni.

  Se non specifichi un'impostazione di consistenza di lettura per l'istanza di mappatore, il valore predefinito sarà `EVENTUAL`.
**Nota**  
Questo valore viene applicato nelle `batch load` operazioni`query`, `querypage``load`, e di Dynamo. DBMapper
+ Un valore di enumerazione `DynamoDBMapperConfig.PaginationLoadingStrategy`: controlla il modo in cui l'istanza del mappatore elabora un elenco impaginato di dati, ad esempio i risultati di una `query` o una `scan`:
  + `LAZY_LOADING`: l'istanza del mappatore carica i dati quando possibile e mantiene tutti i risultati caricati in memoria.
  + `EAGER_LOADING`: l'istanza del mappatore carica i dati non appena l'elenco viene inizializzato.
  + `ITERATION_ONLY`: è possibile utilizzare soltantoo un Iterator per leggere dall'elenco. Durante l'iterazione, l'elenco cancella tutti i risultati precedenti prima di caricare la pagina successiva, in modo che memorizzi al massimo una pagina di risultati caricati. Ciò significa, inoltre, che l'elenco può essere iterato una sola volta. Si consiglia di utilizzare questa strategia quando si gestiscono item di grandi dimensioni, al fine di ridurre il sovraccarico della memoria.

  Se non specifichi una strategia di caricamento della paginazione per l'istanza di mappatore, il valore predefinito sarà `LAZY_LOADING`.
+ Un valore di enumerazione `DynamoDBMapperConfig.SaveBehavior`. Specifica il modo in cui l'istanza di mappatore deve gestire gli attributi durante le operazioni di salvataggio.
  + `UPDATE`: durante un'operazione di salvataggio, tutti gli attributi modellati vengono aggiornati e gli attributi non modellati non vengono influenzati. Tipi di numeri primitivi (byte, int, long) sono impostati su 0. I tipi di oggetto sono impostati su null. 
  + `CLOBBER`: cancella e sostituisce tutti gli attributi, inclusi quelli non modellati, durante un'operazione di salvataggio. Questa operazione viene eseguita eliminando la voce e creandola nuovamente. Vengono ignorate anche le limitazioni dei campi con versione.

   Se non specifichi il comportamento di salvataggio per l'istanza di mappatore, il valore predefinito sarà `UPDATE`.
**Nota**  
Le DBMapper operazioni transazionali di Dynamo non supportano l'enumerazione. `DynamoDBMapperConfig.SaveBehavior` 
+ Un oggetto `DynamoDBMapperConfig.TableNameOverride`: indica all'istanza del mappatore di ignorare il nome della tabella specificato dall'annotazione `DynamoDBTable` della classe e utilizza invece un nome di tabella diverso fornito dall'utente. Ciò può essere utile quando esegui il partizionamento dei dati in più tabelle in fase di runtime. 

Puoi sovrascrivere l'oggetto della configurazione predefinita per `DynamoDBMapper` in ogni operazione, a seconda delle necessità.

# DynamoDB e blocco ottimistico con il numero di versione
<a name="DynamoDBMapper.OptimisticLocking"></a>

Il *blocco ottimistico* è una strategia che assicura che l'elemento lato client che si sta aggiornando (o eliminando) sia lo stesso elemento in Amazon DynamoDB. Se utilizzi questa strategia le scritture del tuo database sono protette da eventuali sovrascritture da parte di altre scritture di terzi e viceversa.

Con il blocco ottimistico, ogni voce dispone di un attributo che funge da numero di versione. Se recuperi un item da una tabella, l'applicazione registra il numero di versione di tale item. Puoi aggiornare l'item, ma solo se il numero di versione lato server non è cambiato. In caso di mancata corrispondenza delle versioni, qualcun altro ha modificato l'item prima dell'utente. Il tentativo di aggiornamento non riesce, perché si dispone di una versione obsoleta dell'item. Se ciò accade, semplicemente riprova a recuperare l’elemento e tenta di aggiornarlo. Il blocco ottimistico evita di sovrascrivere accidentalmente le modifiche che sono state apportate da altri. Impedisce anche ad altri di sovrascrivere accidentalmente le modifiche.

Sebbene tu possa implementare la tua strategia di blocco ottimistica, fornisce l'annotazione. AWS SDK per Java `@DynamoDBVersionAttribute` Nella classe di mappatura della tabella, puoi indicare una proprietà nella quale memorizzare il numero di versione e contrassegnarlo utilizzando questa annotazione. Quando si salva un oggetto, l'elemento corrispondente nella tabella DynamoDB conterrà un attributo che memorizza il numero di versione. `DynamoDBMapper` assegna un numero di versione quando salvi l'oggetto per la prima volta e incrementa automaticamente il numero di versione ogni volta che aggiorni l'item. Le richieste di aggiornamento o eliminazione avranno esito positivo solo se la versione dell'oggetto lato client corrisponde al numero di versione dell'elemento corrispondente nella tabella DynamoDB.

 `ConditionalCheckFailedException` viene generato se: 
+  utilizzi il blocco ottimistico con `@DynamoDBVersionAttribute` e il valore della versione del server è diverso dal valore sul lato client; 
+  specifichi le tue limitazioni condizionali quando salvi i dati utilizzando `DynamoDBMapper` con `DynamoDBSaveExpression` e tali limitazioni non sono riuscite. 

**Nota**  
Le tabelle globali DynamoDB utilizzano una riconciliazione di tipo "last writer wins" per aggiornamenti contestuali. Se utilizzi le tabelle globali, vince la policy "last writer". Pertanto in questo caso la strategia di blocco non funziona come previsto.
Le operazioni di scrittura transazionali `DynamoDBMapper` non supportano l'annotazione e le espressioni di condizione `@DynamoDBVersionAttribute` all'interno dello stesso oggetto. Se un oggetto all'interno di una scrittura transazionale viene annotato con `@DynamoDBVersionAttribute` e ha anche un'espressione condizionale, verrà generata una. SdkClientException 

Ad esempio, nel seguente codice Java si definisce una classe `CatalogItem` che possiede diverse proprietà. La proprietà `Version` viene etichettata con l'annotazione `@DynamoDBVersionAttribute`.

**Example**  

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {

    private Integer id;
    private String title;
    private String ISBN;
    private Set<String> bookAuthors;
    private String someProp;
    private Long version;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer Id) { this.id = Id; }

    @DynamoDBAttribute(attributeName="Title")
    public String getTitle() { return title; }
    public void setTitle(String title) { this.title = title; }

    @DynamoDBAttribute(attributeName="ISBN")
    public String getISBN() { return ISBN; }
    public void setISBN(String ISBN) { this.ISBN = ISBN;}

    @DynamoDBAttribute(attributeName = "Authors")
    public Set<String> getBookAuthors() { return bookAuthors; }
    public void setBookAuthors(Set<String> bookAuthors) { this.bookAuthors = bookAuthors; }

    @DynamoDBIgnore
    public String getSomeProp() { return someProp;}
    public void setSomeProp(String someProp) {this.someProp = someProp;}

    @DynamoDBVersionAttribute
    public Long getVersion() { return version; }
    public void setVersion(Long version) { this.version = version;}
}
```

Puoi applicare l'annotazione `@DynamoDBVersionAttribute` ai tipi nullable disponibili nelle classi wrapper primitive che forniscono un tipo nullable, come `Long` e `Integer`. 

Il blocco ottimistico ha il seguente impatto su questi metodi `DynamoDBMapper`:
+ `save`: per un nuovo elemento, il `DynamoDBMapper` assegna il numero di versione iniziale uguale a 1. Se recuperi un item, aggiorni una o più delle sue proprietà e tenti di salvare le modifiche, l'operazione di salvataggio ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono. `DynamoDBMapper` incrementa il numero di versione in modo automatico.
+ `delete`: il metodo `delete` utilizza un oggetto come parametro e `DynamoDBMapper` esegue un controllo della versione prima di eliminare l'elemento. La verifica della versione può essere disabilitata se nella richiesta viene specificato `DynamoDBMapperConfig.SaveBehavior.CLOBBER`.

  L'implementazione interna del blocco ottimistico in `DynamoDBMapper` utilizza il supporto degli aggiornamenti e delle eliminazioni condizionali fornite da DynamoDB. 
+ `transactionWrite` —
  + `Put`: per un nuovo elemento, il `DynamoDBMapper` assegna il numero di versione iniziale uguale a 1. Se recuperi un item, aggiorni una o più delle sue proprietà e tenti di salvare le modifiche, l'operazione put ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono. `DynamoDBMapper` incrementa il numero di versione in modo automatico.
  + `Update`: per un nuovo elemento, il `DynamoDBMapper` assegna il numero di versione iniziale uguale a 1. Se recuperi un item, aggiorni una o più delle sue proprietà e tenti di salvare le modifiche, l'operazione update ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono. `DynamoDBMapper` incrementa il numero di versione in modo automatico.
  + `Delete`: `DynamoDBMapper` esegue un controllo della versione prima di eliminare l'elemento. L'operazione delete riesce solo se il numero di versione sul lato client e sul lato server corrispondono.
  + `ConditionCheck`: l'annotazione `@DynamoDBVersionAttribute` non è supportata per le operazioni `ConditionCheck`. SdkClientException Verrà generato un elemento quando un `ConditionCheck` elemento viene annotato con. `@DynamoDBVersionAttribute` 

## Disabilitazione del blocco ottimistico
<a name="DynamoDBMapper.OptimisticLocking.Disabling"></a>

Per disabilitare il blocco ottimistico, puoi modificare il valore di enumerazione `DynamoDBMapperConfig.SaveBehavior` da `UPDATE` in `CLOBBER`. Puoi farlo creando un'istanza `DynamoDBMapperConfig` che non esegua la verifica della versione e utilizzi tale istanza per tutte le richieste. Per informazioni sui parametri `DynamoDBMapperConfig.SaveBehavior` e altri parametri opzionali `DynamoDBMapper`, consulta [Impostazioni di configurazione opzionali per Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md). 

Inoltre puoi impostare il comportamento di blocco per una sola operazione specifica. Ad esempio, nel seguente frammento di codice Java si utilizza `DynamoDBMapper` per salvare un item del catalogo. Specifica `DynamoDBMapperConfig.SaveBehavior` aggiungendo il parametro opzionale `DynamoDBMapperConfig` al metodo `save`. 

**Nota**  
Il metodo TransactionWrite non supporta Dynamo Config. DBMapper SaveBehaviorconfigurazione. Disabilitazione del blocco ottimistico per transactionWrite non supportata.

**Example**  

```
DynamoDBMapper mapper = new DynamoDBMapper(client);

// Load a catalog item.
CatalogItem item = mapper.load(CatalogItem.class, 101);
item.setTitle("This is a new title for the item");
...
// Save the item.
mapper.save(item,
    new DynamoDBMapperConfig(
        DynamoDBMapperConfig.SaveBehavior.CLOBBER));
```

# Mappatura dei dati arbitrari in DynamoDB
<a name="DynamoDBMapper.ArbitraryDataMapping"></a>

Oltre ai tipi Java supportati (vedere [Tipi di dati supportati per Dynamo for Java DBMapper](DynamoDBMapper.DataTypes.md)), è possibile utilizzare i tipi dell'applicazione per i quali non vi è una mappatura diretta ai tipi di Amazon DynamoDB. Per mappare questi tipi, è necessario fornire un'implementazione che converta il tipo complesso in un tipo supportato DynamoDB e viceversa; è inoltre necessario annotare il metodo di accesso del tipo complesso utilizzando l'annotazione `@DynamoDBTypeConverted`. Il codice del convertitore trasforma i dati quando gli oggetti vengono salvati o caricati. Viene utilizzato anche per tutte le operazioni che utilizzano tipi complessi. Quando si confrontano i dati durante le operazioni di query e di scansione, i confronti vengono fatti sui dati archiviati in DynamoDB.

Ad esempio, considera la seguente classe `CatalogItem`, che definisce una proprietà, `Dimension`, che è `DimensionType`. Questa proprietà archivia le dimensioni dell'item, quali altezza, larghezza e spessore. Supponiamo che si decida di memorizzare queste dimensioni dell'elemento come una stringa (ad esempio 8,5x11x0,5) in DynamoDB. Nell'esempio seguente viene fornito il codice del convertitore, il quale converte l'oggetto `DimensionType` in una stringa e una stringa in `DimensionType`.



**Nota**  
In questo esempio di codice si presuppone che siano già stati caricati dati in DynamoDB per l'account seguendo le istruzioni riportate nella sezione [Creazione di tabelle e caricamento di dati per esempi di codice in DynamoDB](SampleData.md).  
Per step-by-step istruzioni su come eseguire il seguente esempio, consulta. [Esempi di codice Java](CodeSamples.Java.md)

**Example**  

```
public class DynamoDBMapperExample {

    static AmazonDynamoDB client;

    public static void main(String[] args) throws IOException {

        // Set the AWS region you want to access.
        Regions usWest2 = Regions.US_WEST_2;
        client = AmazonDynamoDBClientBuilder.standard().withRegion(usWest2).build();

        DimensionType dimType = new DimensionType();
        dimType.setHeight("8.00");
        dimType.setLength("11.0");
        dimType.setThickness("1.0");

        Book book = new Book();
        book.setId(502);
        book.setTitle("Book 502");
        book.setISBN("555-5555555555");
        book.setBookAuthors(new HashSet<String>(Arrays.asList("Author1", "Author2")));
        book.setDimensions(dimType);

        DynamoDBMapper mapper = new DynamoDBMapper(client);
        mapper.save(book);

        Book bookRetrieved = mapper.load(Book.class, 502);
        System.out.println("Book info: " + "\n" + bookRetrieved);

        bookRetrieved.getDimensions().setHeight("9.0");
        bookRetrieved.getDimensions().setLength("12.0");
        bookRetrieved.getDimensions().setThickness("2.0");

        mapper.save(bookRetrieved);

        bookRetrieved = mapper.load(Book.class, 502);
        System.out.println("Updated book info: " + "\n" + bookRetrieved);
    }

    @DynamoDBTable(tableName = "ProductCatalog")
    public static class Book {
        private int id;
        private String title;
        private String ISBN;
        private Set<String> bookAuthors;
        private DimensionType dimensionType;

        // Partition key
        @DynamoDBHashKey(attributeName = "Id")
        public int getId() {
            return id;
        }

        public void setId(int id) {
            this.id = id;
        }

        @DynamoDBAttribute(attributeName = "Title")
        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        @DynamoDBAttribute(attributeName = "ISBN")
        public String getISBN() {
            return ISBN;
        }

        public void setISBN(String ISBN) {
            this.ISBN = ISBN;
        }

        @DynamoDBAttribute(attributeName = "Authors")
        public Set<String> getBookAuthors() {
            return bookAuthors;
        }

        public void setBookAuthors(Set<String> bookAuthors) {
            this.bookAuthors = bookAuthors;
        }

        @DynamoDBTypeConverted(converter = DimensionTypeConverter.class)
        @DynamoDBAttribute(attributeName = "Dimensions")
        public DimensionType getDimensions() {
            return dimensionType;
        }

        @DynamoDBAttribute(attributeName = "Dimensions")
        public void setDimensions(DimensionType dimensionType) {
            this.dimensionType = dimensionType;
        }

        @Override
        public String toString() {
            return "Book [ISBN=" + ISBN + ", bookAuthors=" + bookAuthors + ", dimensionType= "
                    + dimensionType.getHeight() + " X " + dimensionType.getLength() + " X "
                    + dimensionType.getThickness()
                    + ", Id=" + id + ", Title=" + title + "]";
        }
    }

    static public class DimensionType {

        private String length;
        private String height;
        private String thickness;

        public String getLength() {
            return length;
        }

        public void setLength(String length) {
            this.length = length;
        }

        public String getHeight() {
            return height;
        }

        public void setHeight(String height) {
            this.height = height;
        }

        public String getThickness() {
            return thickness;
        }

        public void setThickness(String thickness) {
            this.thickness = thickness;
        }
    }

    // Converts the complex type DimensionType to a string and vice-versa.
    static public class DimensionTypeConverter implements DynamoDBTypeConverter<String, DimensionType> {

        @Override
        public String convert(DimensionType object) {
            DimensionType itemDimensions = (DimensionType) object;
            String dimension = null;
            try {
                if (itemDimensions != null) {
                    dimension = String.format("%s x %s x %s", itemDimensions.getLength(), itemDimensions.getHeight(),
                            itemDimensions.getThickness());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return dimension;
        }

        @Override
        public DimensionType unconvert(String s) {

            DimensionType itemDimension = new DimensionType();
            try {
                if (s != null && s.length() != 0) {
                    String[] data = s.split("x");
                    itemDimension.setLength(data[0].trim());
                    itemDimension.setHeight(data[1].trim());
                    itemDimension.setThickness(data[2].trim());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            return itemDimension;
        }
    }
}
```

# Esempi della classe DynamoDBMapper
<a name="DynamoDBMapper.Examples"></a>

L’SDK AWS per Java fornisce una classe `DynamoDBMapper` che consente di mappare le classi lato client alle tabelle DynamoDB. Per utilizzare `DynamoDBMapper`, definire la relazione tra gli elementi di una tabella DynamoDB e le istanze di oggetto corrispondenti nel codice. La classe `DynamoDBMapper` consente di eseguire diverse operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD) sugli elementi e di eseguire query e scansioni sulle tabelle.

Per ulteriori informazioni sull’utilizzo di `DynamoDBMapper`, consulta [DynamoDB Examples Using the AWS SDK for Java ](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-dynamodb.html) nella *Guida per gli sviluppatori di SDK AWS per Java 1.x*. 

# Java 2.x: Client avanzato DynamoDB
<a name="DynamoDBEnhanced"></a>

Il client avanzato DynamoDB è una libreria di alto livello che fa parte di AWS SDK per Java versione 2 (v2). Offre un modo semplice per mappare le classi lato client alle tabelle DynamoDB. È possibile definire le relazioni tra le tabelle e le relative classi di modello corrispondenti nel codice. Dopo aver definito queste relazioni, è possibile eseguire in modo intuitivo varie operazioni di creazione, lettura, aggiornamento o eliminazione (CRUD) su tabelle o elementi in DynamoDB.

Per ulteriori informazioni su come utilizzare il client avanzato con DynamoDB, consulta l'argomento relativo all'[utilizzo del client avanzato DynamoDB in AWS SDK per Java 2.x ](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html). 

# Utilizzo del modello documentale .NET in DynamoDB
<a name="DotNetSDKMidLevel"></a>

AWS SDK per .NET fornisce classi di modelli di documenti che includono alcune operazioni di Amazon DynamoDB di basso livello che semplificano ulteriormente la codifica. Nel modello di documento, le classi primarie sono `Table` e `Document`. La classe `Table` fornisce metodi di operazioni di dati come `PutItem`, `GetItem` e `DeleteItem`. Essa inoltre fornisce i metodi `Query` e `Scan`. La classe `Document` rappresenta un singolo item in una tabella.

Le classi precedenti di modello del documento sono disponibili nello spazio dei nomi `Amazon.DynamoDBv2.DocumentModel`.

**Nota**  
Non puoi utilizzare le classi del modello di documento per creare, aggiornare ed eliminare tabelle. Tuttavia, il modello di documento supporta la maggior parte delle operazioni sui dati comuni.

**Topics**
+ [Tipi di dati supportati](#MidLevelAPILimitations.SupportedTypes)

## Tipi di dati supportati
<a name="MidLevelAPILimitations.SupportedTypes"></a>

Il modello di documento supporta un insieme di tipi di dati .NET primitivi e tipi di raccolte dati. Il modello attualmente supporta i seguenti tipi di dati primitivi: 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Guid`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Nella tabella seguente viene riepilogata la mappatura dei tipi .NET precedenti ai tipi DynamoDB.


****  

| Tipo primitivo .NET | Tipo DynamoDB | 
| --- | --- | 
|  Tutti i tipi di numeri  |  `N` (tipo numero)  | 
|  Tutti i tipi stringa  |  `S` (tipo stringa)   | 
|  MemoryStream, byte[]  |  `B` (tipo binario)   | 
| bool | N (tipo di numero). 0 rappresenta false e 1 rappresenta true. | 
| DateTime | S (tipo stringa). I valori DateTime vengono archiviati come stringhe in formato ISO-8601. | 
| Guid | S (tipo stringa). | 
| Tipi di raccolta (List, HashSet e array) | Tipo BS (set binario), tipo SS (set stringa) o tipo NS (set numerico) | 

AWS SDK per .NET definisce i tipi per la mappatura dei tipi booleani, null, list e map di DynamoDB all'API del modello di documento di .NET:
+ Utilizza `DynamoDBBool` per il tipo Boolean.
+ Utilizza `DynamoDBNull` per il tipo null.
+ Utilizza `DynamoDBList` per il tipo list.
+ Utilizza `Document` per il tipo map.

**Nota**  
Sono supportati valori Binary vuoti.
È supportata la lettura dei valori String vuoti. I valori degli attributi String vuoti sono supportati all'interno dei valori degli attributi di stringa del tipo Set durante la scrittura su DynamoDB. I valori degli attributi String vuoti del tipo String e i valori String vuoti contenuti nel tipo List o Map vengono eliminati dalle richieste di scrittura

# Operazioni con il modello di persistenza degli oggetti di .NET e DynamoDB
<a name="DotNetSDKHighLevel"></a>

 AWS SDK per .NET Fornisce un modello di persistenza degli oggetti che consente di mappare le classi lato client alle tabelle Amazon DynamoDB. Ogni istanza dell'oggetto viene quindi mappata a un elemento nelle tabelle corrispondenti. Per salvare gli oggetti lato client nelle tabelle, il modello di persistenza degli oggetti fornisce la classe `DynamoDBContext`, un punto di ingresso a DynamoDB. Questa classe fornisce una connessione a DynamoDB e consente di accedere alle tabelle, eseguire varie operazioni CRUD ed eseguire query.

Il modello di persistenza degli oggetti fornisce un set di attributi per mappare le classi lato client alle tabelle e agli attributi delle tabelle. properties/fields 

**Nota**  
Il modello di persistenza degli oggetti non fornisce un'API per creare, aggiornare o eliminare tabelle. Esso fornisce solo operazioni di dati. È possibile utilizzare solo l'API di AWS SDK per .NET basso livello per creare, aggiornare ed eliminare tabelle.

L'esempio seguente mostra come funziona il modello di persistenza degli oggetti. Inizia con tabella `ProductCatalog`. La tabella dispone di `Id` come chiave primaria.

```
ProductCatalog(Id, ...)
```

Si supponga di avere una classe `Book` con le proprietà `Title`, `ISBN` e `Authors`. È possibile mappare la classe `Book` alla tabella `ProductCatalog`aggiungendo gli attributi definiti dal modello di persistenza degli oggetti, come mostrato nel seguente esempio di codice C\$1.

**Example**  

```
[DynamoDBTable("ProductCatalog")]
  public class Book
  {
    [DynamoDBHashKey]
    public int Id { get; set; }

    public string Title { get; set; }
    public int ISBN { get; set; }

    [DynamoDBProperty("Authors")]
    public List<string> BookAuthors { get; set; }

    [DynamoDBIgnore]
    public string CoverPage { get; set; }
  }
```

Nell'esempio precedente, l'attributo `DynamoDBTable` associa la classe `Book` alla tabella `ProductCatalog`.

Il modello di persistenza degli oggetti supporta sia la mappatura esplicita che quella predefinita tra le proprietà della classe e gli attributi della tabella.
+ **Mappatura esplicita**: per mappare una proprietà a una chiave primaria, è necessario utilizzare gli attributi del modello di persistenza dell'oggetto `DynamoDBHashKey` e `DynamoDBRangeKey`. Inoltre, per gli attributi della chiave non primaria, se il nome di una proprietà nella classe e l'attributo tabella corrispondente a cui si desidera mapparlo non sono gli stessi, è necessario definire la mappatura aggiungendo esplicitamente l'attributo `DynamoDBProperty`.

  Nell'esempio precedente, la proprietà `Id` viene mappata alla chiave primaria con lo stesso nome e la proprietà `BookAuthors` viene mappata all'attributo `Authors` nella tabella `ProductCatalog`.
+ **Mappatura predefinita**: per impostazione predefinita, il modello di persistenza degli oggetti mappa le proprietà della classe agli attributi con lo stesso nome nella tabella.

  Nell'esempio precedente, le proprietà `Title` e `ISBN` vengono mappate agli attributi con lo stesso nome nella tabella `ProductCatalog`.

Non è necessario mappare ogni singola proprietà della classe. Queste proprietà vengono identificate aggiungendo l'attributo `DynamoDBIgnore`. Quando si salva un'istanza `Book` nella tabella, `DynamoDBContext` non include la proprietà `CoverPage`. Inoltre, non restituisce questa proprietà quando si recupera l'istanza del libro.

È possibile mappare le proprietà di tipi primitivi .NET come int e string. È inoltre possibile mappare qualsiasi tipo di dati arbitrari purché si fornisca un convertitore appropriato per mappare i dati arbitrari a uno dei tipi DynamoDB. Per informazioni sulla mappatura di tipi arbitrari, consulta [Mappatura di dati arbitrari con DynamoDB utilizzando il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.ArbitraryDataMapping.md).

Il modello di persistenza degli oggetti supporta il blocco ottimistico. Durante un'operazione di aggiornamento, questo garantisce di disporre della copia più recente dell'elemento che si sta per aggiornare. Per ulteriori informazioni, consulta [Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.VersionSupport.md).

Per ulteriori informazioni, consulta gli argomenti riportati di seguito.

**Topics**
+ [Tipi di dati supportati](#DotNetDynamoDBContext.SupportedTypes)
+ [Attributi DynamoDB del modello di persistenza degli oggetti di .NET](DeclarativeTagsList.md)
+ [DBContext Classe Dynamo dal modello di persistenza degli oggetti.NET](DotNetDynamoDBContext.md)
+ [Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.VersionSupport.md)
+ [Mappatura di dati arbitrari con DynamoDB utilizzando il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.ArbitraryDataMapping.md)

## Tipi di dati supportati
<a name="DotNetDynamoDBContext.SupportedTypes"></a>

Il modello di persistenza degli oggetti supporta un insieme di tipi di dati .NET primitivi e tipi di dati arbitrari. Il modello supporta i seguenti tipi di dati primitivi: 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Il modello di persistenza degli oggetti supporta anche i tipi di raccolte.NET. `DynamoDBContext`è in grado di convertire tipi di raccolta concreti e semplici oggetti Plain Old CLR ()POCOs.

Nella tabella seguente viene riepilogata la mappatura dei tipi .NET precedenti ai tipi DynamoDB.


****  

| Tipo primitivo .NET | Tipo DynamoDB | 
| --- | --- | 
|  Tutti i tipi di numeri  |  `N` (tipo numero)  | 
|  Tutti i tipi stringa  |  `S` (tipo stringa)   | 
|  MemoryStream, byte []  |  `B` (tipo binario)   | 
| bool | N (tipo di numero). 0 rappresenta false e 1 rappresenta true. | 
| Tipi di raccolta | Tipo BS (set binario), tipo SS (set stringa) o tipo NS (set numerico) | 
| DateTime | S (tipo stringa). I valori DateTime vengono archiviati come stringhe in formato ISO-8601. | 

Il modello di persistenza degli oggetti supporta anche tipi di dati arbitrari. Tuttavia, è necessario fornire il codice del convertitore per mappare i tipi complessi ai tipi DynamoDB.

**Nota**  
Sono supportati valori Binary vuoti.
È supportata la lettura dei valori String vuoti. I valori degli attributi String vuoti sono supportati all'interno dei valori degli attributi di stringa del tipo Set durante la scrittura su DynamoDB. I valori degli attributi String vuoti del tipo String e i valori String vuoti contenuti nel tipo List o Map vengono eliminati dalle richieste di scrittura

# Attributi DynamoDB del modello di persistenza degli oggetti di .NET
<a name="DeclarativeTagsList"></a>

In questa sezione vengono descritti gli attributi offerti dal modello di persistenza degli oggetti in modo che sia possibile mappare le classi e le proprietà alle tabelle e agli attributi DynamoDB.

**Nota**  
Negli attributi seguenti, solo `DynamoDBTable` e `DynamoDBHashKey` sono obbligatori.

## Dinamo DBGlobal SecondaryIndexHashKey
<a name="w2aac17b9c21c23c37b7"></a>

Mappa una proprietà di classe alla chiave di partizione di un indice secondario globale. Utilizza questo attributo se è necessario eseguire una `Query` su un indice secondario globale.

## Dinamo DBGlobal SecondaryIndexRangeKey
<a name="w2aac17b9c21c23c37b9"></a>

Associa una proprietà di classe alla chiave di ordinamento di un indice secondario globale. Utilizza questo attributo se è necessario eseguire una `Query` su un indice secondario globale e si desidera rifinire i risultati utilizzando la chiave di ordinamento dell'indice.

## Chiave Dynamo DBHash
<a name="w2aac17b9c21c23c37c11"></a>

Mappa una proprietà della classe alla chiave di partizione della chiave primaria della tabella. Gli attributi della chiave primaria non possono essere un tipo di raccolta.

L'esempio di codice C\$1 seguente mappa la classe `Book`alla tabella `ProductCatalog` e la proprietà `Id` alla chiave di partizione della chiave primaria della tabella.

```
[DynamoDBTable("ProductCatalog")]
public class Book 
{
    [DynamoDBHashKey]
    public int Id { get; set; }

    // Additional properties go here.
}
```

## Dinamo DBIgnore
<a name="w2aac17b9c21c23c37c13"></a>

Indica che la proprietà associata deve essere ignorata. Se non si desidera salvare nessuna delle proprietà di classe, è possibile aggiungere questo attributo per indicare a `DynamoDBContext` di non includere questa proprietà quando si salvano oggetti nella tabella.

## Dinamo DBLocal SecondaryIndexRangeKey
<a name="w2aac17b9c21c23c37c15"></a>

Mappa una proprietà di classe alla chiave di ordinamento di un indice secondario globale. Utilizza questo attributo se è necessario eseguire una `Query` su un indice secondario locale e si desidera rifinire i risultati utilizzando la chiave di ordinamento dell'indice.

## Dinamo DBProperty
<a name="w2aac17b9c21c23c37c17"></a>

Mappa una proprietà della classe all'attributo di una tabella. Se la proprietà della classe viene mappata a un attributo di tabella con lo stesso nome, non è necessario specificare l'attributo. Tuttavia, se i nomi non sono gli stessi, è possibile utilizzare questo tag per fornire la mappatura. Nella seguente istruzione C\$1, `DynamoDBProperty` mappa la proprietà `BookAuthors` all'attributo `Authors` della tabella. 

```
[DynamoDBProperty("Authors")]
public List<string> BookAuthors { get; set; }
```

`DynamoDBContext` utilizza queste informazioni di mappatura per creare l'attributo `Authors` quando si salvano i dati dell'oggetto nella tabella corrispondente.

## Dinamo DBRenamable
<a name="w2aac17b9c21c23c37c19"></a>

Specifica un nome alternativo per una proprietà di classe. Ciò è utile se si sta scrivendo un convertitore personalizzato per mappare dati arbitrari a una tabella DynamoDB in cui il nome di una proprietà della classe è diverso da un attributo di tabella.

## Chiave Dynamo DBRange
<a name="w2aac17b9c21c23c37c21"></a>

Mappa una proprietà di classe alla chiave di ordinamento della chiave primaria della tabella. Se la tabella dispone di una chiave primaria composita (chiave di partizione e chiave di ordinamento), nella mappatura della classe è necessario specificare entrambi gli attributi `DynamoDBHashKey` e `DynamoDBRangeKey`.

Ad esempio, la tabella di esempio `Reply` ha una chiave primaria composta dalla chiave di partizione `Id` e dalla chiave di ordinamento `Replenishment`. Nell'esempio di codice C\$1 seguente la classe `Reply` viene mappata alla tabella `Reply`. La definizione di classe indica anche che due delle sue proprietà vengono mappate alla chiave primaria.

```
[DynamoDBTable("Reply")]
public class Reply 
{
   [DynamoDBHashKey]
   public int ThreadId { get; set; }
   [DynamoDBRangeKey]
   public string Replenishment { get; set; }
   
   // Additional properties go here.
}
```

## Dinamo DBTable
<a name="w2aac17b9c21c23c37c23"></a>

Identifica la tabella di destinazione di DynamoDB a cui viene mappata la classe. Nell'esempio di codice C\$1 seguente la classe `Developer` viene mappata alla tabella `People` in DynamoDB.

```
[DynamoDBTable("People")]
public class Developer { ...}
```

Questo attributo può essere ereditato o sovrascritto.
+ L'attributo `DynamoDBTable` può essere ereditato. Nell'esempio precedente, se si aggiunge una nuova classe ,`Lead`, che eredita dalla classe `Developer`, la classe viene mappata anche alla tabella `People`. Entrambi gli oggetti `Developer` e `Lead` vengono archiviati nella tabella `People`.
+ L'attributo `DynamoDBTable` può anche essere sovrascritto. Nel seguente esempio di codice C\$1, la classe `Manager`eredita dalla classe `Developer`. Tuttavia, l'aggiunta esplicita dell'attributo `DynamoDBTable` mappa la classe a un'altra tabella (`Managers`).

  ```
  [DynamoDBTable("Managers")]
  public class Manager : Developer { ...}
  ```

 È possibile aggiungere il parametro opzionale, `LowerCamelCaseProperties`, per richiedere a DynamoDB di rendere minuscola la prima lettera del nome della proprietà quando si memorizzano gli oggetti in una tabella, come illustrato nell'esempio C\$1 riportato di seguito.

```
[DynamoDBTable("People", LowerCamelCaseProperties=true)]
public class Developer 
{
    string DeveloperName;
    ...
}
```

Quando si salvano le istanze della classe `Developer`, `DynamoDBContext` salva la proprietà `DeveloperName` come `developerName`.

## Dinamo DBVersion
<a name="w2aac17b9c21c23c37c25"></a>

Identifica una proprietà di classe per l'archiviazione del numero di versione dell'elemento. Per ulteriori informazioni sulla funzione Controllo delle versioni, consulta [Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.VersionSupport.md).

# DBContext Classe Dynamo dal modello di persistenza degli oggetti.NET
<a name="DotNetDynamoDBContext"></a>

La classe `DynamoDBContext` è il punto di ingresso al database Amazon DynamoDB. Fornisce una connessione a DynamoDB e permette di accedere ai dati in varie tabelle, eseguire diverse operazioni CRUD ed eseguire query. La classe `DynamoDBContext` fornisce i metodi seguenti:

**Topics**
+ [Crea MultiTable BatchGet](#w2aac17b9c21c23c39b7)
+ [Crea MultiTable BatchWrite](#w2aac17b9c21c23c39b9)
+ [CreateBatchGet](#w2aac17b9c21c23c39c11)
+ [CreateBatchWrite](#w2aac17b9c21c23c39c13)
+ [Elimina](#w2aac17b9c21c23c39c15)
+ [Elimina](#w2aac17b9c21c23c39c17)
+ [Execute​Batch​Get](#w2aac17b9c21c23c39c19)
+ [Execute​Batch​Write](#w2aac17b9c21c23c39c21)
+ [FromDocument](#w2aac17b9c21c23c39c23)
+ [FromQuery](#w2aac17b9c21c23c39c25)
+ [FromScan](#w2aac17b9c21c23c39c27)
+ [Get​Target​Table](#w2aac17b9c21c23c39c29)
+ [Carica](#w2aac17b9c21c23c39c31)
+ [Query](#w2aac17b9c21c23c39c33)
+ [Save (Salva)](#w2aac17b9c21c23c39c35)
+ [Scan](#w2aac17b9c21c23c39c37)
+ [ToDocument](#w2aac17b9c21c23c39c39)
+ [Specificazione dei parametri opzionali per Dynamo DBContext](#OptionalConfigParams)

## Crea MultiTable BatchGet
<a name="w2aac17b9c21c23c39b7"></a>

Crea un oggetto `MultiTableBatchGet`, composto da più oggetti `BatchGet`. Ognuno di questi oggetti `BatchGet` può essere utilizzato per recuperare elementi da una singola tabella DynamoDB.

Per recuperare gli elementi dalle tabelle, utilizza il metodo `ExecuteBatchGet`, passando l'oggetto `MultiTableBatchGet` come parametro.

## Crea MultiTable BatchWrite
<a name="w2aac17b9c21c23c39b9"></a>

Crea un oggetto `MultiTableBatchWrite`, composto da più oggetti `BatchWrite`. Ognuno di questi oggetti `BatchWrite` può essere utilizzato per scrivere o eliminare elementi in una singola tabella DynamoDB.

Per scrivere sulle tabelle, utilizza il metodo `ExecuteBatchWrite`, passando l'oggetto `MultiTableBatchWrite` come parametro.

## CreateBatchGet
<a name="w2aac17b9c21c23c39c11"></a>

Crea un oggetto `BatchGet` da usare per recuperare più elementi da una tabella. 

## CreateBatchWrite
<a name="w2aac17b9c21c23c39c13"></a>

Crea un oggetto `BatchWrite` che è possibile utilizzare per inserire più elementi in una tabella o per eliminare più elementi da una tabella. 

## Elimina
<a name="w2aac17b9c21c23c39c15"></a>

Elimina un item dalla tabella. Il metodo richiede la chiave primaria dell'elemento che si desidera eliminare. È possibile fornire il valore della chiave primaria o un oggetto lato client contenente un valore di chiave primaria come parametro per questo metodo.
+ Se si specifica un oggetto lato client come parametro ed è stato abilitato il blocco ottimistico, l'eliminazione avrà esito positivo solo se le versioni lato client e lato server dell'oggetto corrispondono.
+ Se si specifica come parametro solo il valore della chiave primaria, l'eliminazione avrà esito positivo indipendentemente dal fatto che sia stato abilitato o meno il blocco ottimistico.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `DeleteAsync`.

## Elimina
<a name="w2aac17b9c21c23c39c17"></a>

Elimina tutte le risorse gestite e non gestite.

## Execute​Batch​Get
<a name="w2aac17b9c21c23c39c19"></a>

Legge i dati da una o più tabelle, elaborando tutti gli oggetti `BatchGet` in un `MultiTableBatchGet`.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `ExecuteBatchGetAsync`.

## Execute​Batch​Write
<a name="w2aac17b9c21c23c39c21"></a>

Scrive o elimina i dati in una o più tabelle, elaborando tutti gli oggetti `BatchWrite` in un `MultiTableBatchWrite`.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `ExecuteBatchWriteAsync`.

## FromDocument
<a name="w2aac17b9c21c23c39c23"></a>

Data un'istanza di un `Document`, il metodo `FromDocument` restituisce un'istanza di una classe lato client.

Ciò è utile se si desidera utilizzare le classi del modello di documento insieme al modello di persistenza degli oggetti per eseguire qualsiasi operazione sui dati. Per ulteriori informazioni sulle classi del modello di documento fornite da AWS SDK per .NET, vedere[Utilizzo del modello documentale .NET in DynamoDB](DotNetSDKMidLevel.md).

Si supponga di avere un oggetto `Document` denominato `doc`, che contiene una rappresentazione di un elemento `Forum`. Per vedere come costruire questo oggetto, consulta la descrizione del metodo `ToDocument` più avanti in questo argomento). È possibile utilizzare `FromDocument` per recuperare l'elemento `Forum`dal `Document`, come mostrato nell'esempio di codice C\$1 seguente.

**Example**  

```
forum101 = context.FromDocument<Forum>(101);
```

**Nota**  
Se l'oggetto `Document` implementa l'interfaccia `IEnumerable`, è possibile utilizzare invece il metodo `FromDocuments`. Ciò consente di eseguire iterazioni su tutte le istanze della classe nel `Document`.

## FromQuery
<a name="w2aac17b9c21c23c39c25"></a>

Esegue un'operazione `Query`, con i parametri di query definiti in un oggetto `QueryOperationConfig`.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `FromQueryAsync`.

## FromScan
<a name="w2aac17b9c21c23c39c27"></a>

Esegue un'operazione `Scan`, con i parametri di scansione definiti in un oggetto `ScanOperationConfig`.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `FromScanAsync`.

## Get​Target​Table
<a name="w2aac17b9c21c23c39c29"></a>

Recupera la tabella di destinazione per il tipo specificato. Ciò è utile se si sta scrivendo un convertitore personalizzato per mappare dati arbitrari a una tabella DynamoDB ed è necessario determinare quale tabella è associata a un tipo di dati personalizzato.

## Carica
<a name="w2aac17b9c21c23c39c31"></a>

Recupera un item da una tabella. Il metodo richiede solo la chiave primaria dell'elemento che si desidera recuperare. 

Per impostazione predefinita, DynamoDB restituisce l'elemento che dispone di valori che sono a consistenza finale. Per informazioni sul modello di consistenza finale, consulta [Coerenza di lettura di DynamoDB](HowItWorks.ReadConsistency.md).

`Load`or `LoadAsync` method chiama l'[GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)operazione, che richiede di specificare la chiave primaria per la tabella. Poiché `GetItem` ignora il parametro `IndexName`, non è possibile caricare un elemento utilizzando la partizione o la chiave di ordinamento di un indice. Pertanto, è necessario utilizzare la chiave primaria della tabella per caricare un elemento.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `LoadAsync`. Per visualizzare un esempio di utilizzo del metodo `LoadAsync` per eseguire operazioni CRUD di alto livello su una tabella DynamoDB, consulta l’esempio seguente.

```
    /// <summary>
    /// Shows how to perform high-level CRUD operations on an Amazon DynamoDB
    /// table.
    /// </summary>
    public class HighLevelItemCrud
    {
        public static async Task Main()
        {
            var client = new AmazonDynamoDBClient();
            DynamoDBContext context = new DynamoDBContext(client);
            await PerformCRUDOperations(context);
        }

        public static async Task PerformCRUDOperations(IDynamoDBContext context)
        {
            int bookId = 1001; // Some unique value.
            Book myBook = new Book
            {
                Id = bookId,
                Title = "object persistence-AWS SDK for.NET SDK-Book 1001",
                Isbn = "111-1111111001",
                BookAuthors = new List<string> { "Author 1", "Author 2" },
            };

            // Save the book to the ProductCatalog table.
            await context.SaveAsync(myBook);

            // Retrieve the book from the ProductCatalog table.
            Book bookRetrieved = await context.LoadAsync<Book>(bookId);

            // Update some properties.
            bookRetrieved.Isbn = "222-2222221001";

            // Update existing authors list with the following values.
            bookRetrieved.BookAuthors = new List<string> { " Author 1", "Author x" };
            await context.SaveAsync(bookRetrieved);

            // Retrieve the updated book. This time, add the optional
            // ConsistentRead parameter using DynamoDBContextConfig object.
            await context.LoadAsync<Book>(bookId, new DynamoDBContextConfig
            {
                ConsistentRead = true,
            });

            // Delete the book.
            await context.DeleteAsync<Book>(bookId);

            // Try to retrieve deleted book. It should return null.
            Book deletedBook = await context.LoadAsync<Book>(bookId, new DynamoDBContextConfig
            {
                ConsistentRead = true,
            });

            if (deletedBook == null)
            {
                Console.WriteLine("Book is deleted");
            }
        }
    }
```

## Query
<a name="w2aac17b9c21c23c39c33"></a>

Interroga una tabella in base ai parametri di query forniti.

È possibile eseguire una query su una tabella solo se la tabella dispone di una chiave primaria composita (una chiave di partizione e una chiave di ordinamento). Quando si esegue una query, è necessario specificare una chiave di partizione e una condizione che si applichi alla chiave di ordinamento.

Si supponga di disporre di una classe `Reply` lato client mappata alla tabella `Reply` in DynamoDB. L'esempio di codice C\$1 seguente esegue una query sulla tabella`Reply` per ottenere le risposte a un thread del forum pubblicate negli ultimi 15 giorni. La tabella `Reply` ha una chiave primaria che ha la chiave di partizione `Id` e la chiave di ordinamento `ReplyDateTime`.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);

string replyId = "DynamoDB#DynamoDB Thread 1"; //Partition key
DateTime twoWeeksAgoDate = DateTime.UtcNow.Subtract(new TimeSpan(14, 0, 0, 0)); // Date to compare.
IEnumerable<Reply> latestReplies = context.Query<Reply>(replyId, QueryOperator.GreaterThan, twoWeeksAgoDate);
```

Restituisce una raccolta di oggetti `Reply`. 

Il metodo `Query` restituisce una raccolta `IEnumerable` a "caricamento differito". Inizialmente restituisce solo una pagina di risultati e in seguito effettua una chiamata di assistenza per la pagina successiva, se necessario. Per ottenere tutti gli elementi corrispondenti, è necessario iterare solo su `IEnumerable`.

Se la tabella ha una chiave primaria semplice (chiave di partizione), non è possibile utilizzare il metodo `Query`. Invece, è possibile utilizzare il metodo `Load` e fornire la chiave di partizione per recuperare l'elemento.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `QueryAsync`.

## Save (Salva)
<a name="w2aac17b9c21c23c39c35"></a>

Salva l'oggetto specificato nella tabella. Se la chiave primaria specificata nell'oggetto di input non esiste nella tabella, il metodo aggiunge un nuovo elemento alla tabella. Se esiste la chiave primaria, il metodo aggiorna l'elemento esistente.

Se è stato configurato il blocco ottimistico, l'aggiornamento avrà esito positivo solo se le versioni lato client e lato server dell'elemento corrispondono. Per ulteriori informazioni, consulta [Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.VersionSupport.md).

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `SaveAsync`.

## Scan
<a name="w2aac17b9c21c23c39c37"></a>

Esegue la scansione dell'intera tabella. 

È possibile filtrare i risultati della scansione specificando una condizione di scansione. La condizione può essere valutata in base a qualsiasi attributo nella tabella. Si supponga di disporre di una classe `Book` lato client mappata alla tabella `ProductCatalog` in DynamoDB. Nell'esempio di C\$1 seguente viene eseguita la scansione della tabella e vengono restituiti solo gli elementi del libro con un prezzo inferiore a 0.

**Example**  

```
IEnumerable<Book> itemsWithWrongPrice = context.Scan<Book>(
                    new ScanCondition("Price", ScanOperator.LessThan, price),
                    new ScanCondition("ProductCategory", ScanOperator.Equal, "Book")
      );
```

Il metodo `Scan` restituisce una raccolta `IEnumerable` a "caricamento differito". Inizialmente restituisce solo una pagina di risultati e in seguito effettua una chiamata di assistenza per la pagina successiva, se necessario. Per ottenere tutti gli elementi corrispondenti, è necessario iterare solo su `IEnumerable`.

Per motivi di prestazioni, è preferibile eseguire query sulle tabelle ed evitare le scansioni.

**Nota**  
Per eseguire questa operazione in background, utilizza invece il metodo `ScanAsync`.

## ToDocument
<a name="w2aac17b9c21c23c39c39"></a>

Restituisce un'istanza della classe del modello di documento `Document` dall'istanza della classe. 

Ciò è utile se si desidera utilizzare le classi del modello di documento insieme al modello di persistenza degli oggetti per eseguire qualsiasi operazione sui dati. Per ulteriori informazioni sulle classi del modello di documento fornite da AWS SDK per .NET, vedere[Utilizzo del modello documentale .NET in DynamoDB](DotNetSDKMidLevel.md). 

Si supponga di disporre di una classe lato client mappata alla tabella `Forum` di esempio. È quindi possibile utilizzare un `DynamoDBContext` per ottenere un elemento come oggetto `Document` dalla tabella `Forum`, come mostrato nell'esempio di codice C\$1 seguente.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);

Forum forum101 = context.Load<Forum>(101); // Retrieve a forum by primary key.
Document doc = context.ToDocument<Forum>(forum101);
```

## Specificazione dei parametri opzionali per Dynamo DBContext
<a name="OptionalConfigParams"></a>

Quando si utilizza il modello di persistenza degli oggetti, è possibile specificare i parametri facoltativi che seguono per `DynamoDBContext`.
+ **`ConsistentRead`:** quando si recuperano i dati utilizzando le operazioni `Load`, `Query` o `Scan`, è possibile aggiungere questo parametro facoltativo per richiedere i valori più recenti dei dati.
+ **`IgnoreNullValues`:** questo parametro indica a `DynamoDBContext` di ignorare i valori nulli sugli attributi durante un'operazione `Save`. Se questo parametro è false (o se non è impostato), allora un valore null viene interpretato come una direttiva per eliminare l'attributo specifico. 
+ **`SkipVersionCheck`:** questo parametro indica a `DynamoDBContext` di non confrontare le versioni durante il salvataggio o l'eliminazione di un elemento. Per ulteriori informazioni sulla funzione Controllo delle versioni, consulta [Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK per .NET](DynamoDBContext.VersionSupport.md).
+ **`TableNamePrefix`:** aggiunge un prefisso a tutti i nomi delle tabelle con una stringa specifica. Se questo parametro è null (o se non è impostato), allora non viene utilizzato alcun prefisso.
+ `DynamoDBEntryConversion`: specifica lo schema di conversione utilizzato dal client. È possibile impostare questo parametro sulla versione V1 o V2. V1 è la versione predefinita.

  In base alla versione impostata, il comportamento di questo parametro cambia. Esempio:
  + In V1, il tipo di dati `bool` viene convertito nel tipo numerico `N`, dove 0 rappresenta false e 1 rappresenta true. In V2, `bool` viene convertito in `BOOL`.
  + Nella V2, gli elenchi e gli array non sono raggruppati con. HashSets Gli elenchi e gli array di valori numerici, tipi basati su stringhe e tipi a base binaria vengono convertiti nel tipo `L` (List, elenco), che può essere inviato vuoto per aggiornare un elenco. Il caso è diverso da V1, in cui un elenco vuoto non viene inviata in rete.

    Nella V1, i tipi di raccolta, come List HashSet, e gli array vengono trattati allo stesso modo. L'elenco e HashSet la matrice di numeri vengono convertiti nel tipo `NS` (set di numeri). 

  L’esempio seguente imposta la versione dello schema di conversione su V2, che modifica il comportamento di conversione tra tipi .NET e tipi di dati DynamoDB.

  ```
  var config = new DynamoDBContextConfig
  {
      Conversion = DynamoDBEntryConversion.V2
  };
  var contextV2 = new DynamoDBContext(client, config);
  ```

L’esempio C\$1 seguente crea un nuovo `DynamoDBContext` specificando due dei parametri facoltativi precedenti, `ConsistentRead` e `SkipVersionCheck`.

**Example**  

```
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
...
DynamoDBContext context =
       new DynamoDBContext(client, new DynamoDBContextConfig { ConsistentRead = true, SkipVersionCheck = true});
```

`DynamoDBContext` include questi parametri facoltativi con ogni richiesta inviata utilizzando questo contesto. 

Invece di impostare questi parametri al livello `DynamoDBContext`, è possibile specificarli per le singole operazioni eseguite utilizzando `DynamoDBContext`, come mostrato nell'esempio di codice C\$1 seguente. L'esempio carica un elemento del libro specifico. Il metodo `Load` di `DynamoDBContext` specifica i parametri facoltativi `ConsistentRead` e `SkipVersionCheck`.

**Example**  

```
AmazonDynamoDBClient client = new AmazonDynamoDBClient();
...
DynamoDBContext context = new DynamoDBContext(client);
Book bookItem = context.Load<Book>(productId,new DynamoDBContextConfig{ ConsistentRead = true, SkipVersionCheck = true });
```

In questo caso, `DynamoDBContext` include questi parametri solo quando si invia la richiesta `Get`.

# Blocco ottimistico con DynamoDB e il modello di persistenza degli oggetti AWS SDK per .NET
<a name="DynamoDBContext.VersionSupport"></a>

Il supporto ottimistico del blocco nel modello di persistenza degli oggetti garantisce che la versione dell'elemento per l'applicazione corrisponda alla versione dell'elemento sul lato server prima di aggiornare o eliminare l'elemento. Si supponga di recuperare un elemento per l'aggiornamento. Tuttavia, prima di inviare nuovamente gli aggiornamenti, alcune altre applicazioni aggiornano lo stesso elemento. In questa situazione, la tua applicazione avrà una copia obsoleta dell'elemento. Senza il blocco ottimistico, qualsiasi aggiornamento eseguito sovrascriverà l'aggiornamento effettuato dall'altra applicazione. 

La funzione di blocco ottimistica del modello di persistenza degli oggetti fornisce il tag `DynamoDBVersion` che è possibile utilizzare per abilitare il blocco ottimistico. Per utilizzare questa funzionalità, è necessario aggiungere una proprietà alla classe per memorizzare il numero di versione. Quindi aggiungere l'attributo `DynamoDBVersion` alla proprietà. Quando si salva l'oggetto per la prima volta, `DynamoDBContext` assegna un numero di versione che viene incrementato automaticamente ogni volta che si aggiorna l'elemento. 

Le richieste di aggiornamento ed eliminazione hanno esito positivo solo se la versione dell'oggetto lato client corrisponde al numero di versione dell'elemento corrispondente del lato server. Se l'applicazione dispone di una copia non aggiornata, deve ottenere la versione più recente dal server prima di poter aggiornare o eliminare tale elemento.

L'esempio di codice C\$1 seguente definisce una classe `Book` con attributi di persistenza dell'oggetto che la mappano alla tabella `ProductCatalog`. La proprietà `VersionNumber` nella classe lavorata con l'attributo `DynamoDBVersion` memorizza il valore del numero di versione.

**Example**  

```
[DynamoDBTable("ProductCatalog")]
  public class Book
  {
    [DynamoDBHashKey]   //Partition key
    public int Id { get; set; }
    [DynamoDBProperty]
    public string Title { get; set; }
    [DynamoDBProperty]
    public string ISBN { get; set; }
    [DynamoDBProperty("Authors")]
    public List<string> BookAuthors { get; set; }
    [DynamoDBVersion]
    public int? VersionNumber { get; set; }
  }
```

**Nota**  
Puoi applicare l'attributo `DynamoDBVersion` solo a un tipo primitivo numerico annullabile (come `int?`). 

Il blocco ottimistico ha il seguente impatto sulle operazioni `DynamoDBContext`:
+ Per un nuovo elemento, `DynamoDBContext` assegna il numero di versione iniziale uguale a 0. Se si recupera un elemento esistente, si aggiorna una o più delle sue proprietà e si prova a salvare le modifiche, l'operazione di salvataggio ha esito positivo solo se il numero di versione sul lato client e sul lato server corrispondono. `DynamoDBContext` incrementa quindi il numero di versione. Non è necessario impostare il numero di versione.
+ Il metodo `Delete` fornisce overload che possono assumere il valore di una chiave primaria o un oggetto come parametro, come mostrato nel seguente esempio di codice C\$1.  
**Example**  

  ```
  DynamoDBContext context = new DynamoDBContext(client);
  ...
  // Load a book.
  Book book = context.Load<ProductCatalog>(111);
  // Do other operations.
  // Delete 1 - Pass in the book object.
  context.Delete<ProductCatalog>(book);
  
  // Delete 2 - Pass in the Id (primary key)
  context.Delete<ProductCatalog>(222);
  ```

  Se si specifica un oggetto come parametro, l'eliminazione ha esito positivo solo se la versione dell'oggetto corrisponde alla versione dell'elemento lato server corrispondente. Tuttavia, se si specifica un valore di chiave primaria come parametro, `DynamoDBContext` non è a conoscenza di alcun numero di versione ed elimina l'elemento senza effettuare il controllo della versione. 

  Tenere presente che l'implementazione interna del blocco ottimistico nel codice del modello di persistenza degli oggetti utilizza l'aggiornamento condizionale e le operazioni API di eliminazione condizionale in DynamoDB.

## Disabilitazione del blocco ottimistico
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

Per disabilitare il blocco ottimistico, utilizza la proprietà di configurazione `SkipVersionCheck`. È possibile impostare questa proprietà durante la creazione di `DynamoDBContext`. In questo caso, il blocco ottimistico è disabilitato per qualsiasi richiesta effettuata utilizzando il contesto. Per ulteriori informazioni, consulta [Specificazione dei parametri opzionali per Dynamo DBContext](DotNetDynamoDBContext.md#OptionalConfigParams). 

Invece di impostare la proprietà a livello di contesto, è possibile disattivare il blocco ottimistico per un'operazione specifica, come mostrato nel seguente esempio di codice C\$1. Nell'esempio viene utilizzato il contesto per eliminare un elemento del libro. Il metodo `Delete` imposta la proprietà `SkipVersionCheck` facoltativa su true, disabilitando il controllo della versione.

**Example**  

```
DynamoDBContext context = new DynamoDBContext(client);
// Load a book.
Book book = context.Load<ProductCatalog>(111);
...
// Delete the book.
context.Delete<Book>(book, new DynamoDBContextConfig { SkipVersionCheck = true });
```

# Mappatura di dati arbitrari con DynamoDB utilizzando il modello di persistenza degli oggetti AWS SDK per .NET
<a name="DynamoDBContext.ArbitraryDataMapping"></a>

Oltre ai tipi .NET supportati (vedere [Tipi di dati supportati](DotNetSDKHighLevel.md#DotNetDynamoDBContext.SupportedTypes)), è possibile utilizzare i tipi dell'applicazione per i quali non vi è una mappatura diretta ai tipi di Amazon DynamoDB. Il modello di persistenza degli oggetti supporta la memorizzazione di dati di tipi arbitrari purché si fornisca il convertitore per convertire i dati dal tipo arbitrario al tipo DynamoDB e viceversa. Il codice convertitore trasforma i dati sia durante il salvataggio che durante il caricamento degli oggetti.

È possibile creare qualsiasi tipo sul lato client. Tuttavia, i dati memorizzati nelle tabelle sono uno dei tipi DynamoDB e durante la query e la scansione, tutti i confronti di dati effettuati sono rispetto ai dati memorizzati in DynamoDB.

L'esempio di codice C\$1 seguente definisce una classe `Book` con le proprietà `Id`, `Title`, `ISBN` e `Dimension`. La proprietà `Dimension` è di `DimensionType` che descrive le proprietà `Height`, `Width` e `Thickness`. Il codice di esempio fornisce i metodi del convertitore`ToEntry` e `FromEntry` per convertire i dati tra `DimensionType` e i tipi di stringa DynamoDB. Ad esempio, quando si salva un'istanza `Book`, il convertitore crea una stringa `Dimension` del libro come "8.5x11x.05". Quando recuperi un libro, converte la stringa in un'istanza `DimensionType`.

Nell'esempio viene mappato il tipo `Book` alla tabella `ProductCatalog`. Salva un'istanza `Book` di esempio, la recupera, aggiorna le sue dimensioni e salva di nuovo il `Book` aggiornato.



Per step-by-step istruzioni su come testare il seguente esempio, consulta. [Esempi di codice .NET](CodeSamples.DotNet.md)

**Example**  

```
using System;
using System.Collections.Generic;
using Amazon.DynamoDBv2;
using Amazon.DynamoDBv2.DataModel;
using Amazon.DynamoDBv2.DocumentModel;
using Amazon.Runtime;
using Amazon.SecurityToken;

namespace com.amazonaws.codesamples
{
    class HighLevelMappingArbitraryData
    {
        private static AmazonDynamoDBClient client = new AmazonDynamoDBClient();

        static void Main(string[] args)
        {
            try
            {
                DynamoDBContext context = new DynamoDBContext(client);

                // 1. Create a book.
                DimensionType myBookDimensions = new DimensionType()
                {
                    Length = 8M,
                    Height = 11M,
                    Thickness = 0.5M
                };

                Book myBook = new Book
                {
                    Id = 501,
                    Title = "AWS SDK for .NET Object Persistence Model Handling Arbitrary Data",
                    ISBN = "999-9999999999",
                    BookAuthors = new List<string> { "Author 1", "Author 2" },
                    Dimensions = myBookDimensions
                };

                context.Save(myBook);

                // 2. Retrieve the book.
                Book bookRetrieved = context.Load<Book>(501);

                // 3. Update property (book dimensions).
                bookRetrieved.Dimensions.Height += 1;
                bookRetrieved.Dimensions.Length += 1;
                bookRetrieved.Dimensions.Thickness += 0.2M;
                // Update the book.
                context.Save(bookRetrieved);

                Console.WriteLine("To continue, press Enter");
                Console.ReadLine();
            }
            catch (AmazonDynamoDBException e) { Console.WriteLine(e.Message); }
            catch (AmazonServiceException e) { Console.WriteLine(e.Message); }
            catch (Exception e) { Console.WriteLine(e.Message); }
        }
    }
    [DynamoDBTable("ProductCatalog")]
    public class Book
    {
        [DynamoDBHashKey] //Partition key
        public int Id
        {
            get; set;
        }
        [DynamoDBProperty]
        public string Title
        {
            get; set;
        }
        [DynamoDBProperty]
        public string ISBN
        {
            get; set;
        }
        // Multi-valued (set type) attribute.
        [DynamoDBProperty("Authors")]
        public List<string> BookAuthors
        {
            get; set;
        }
        // Arbitrary type, with a converter to map it to DynamoDB type.
        [DynamoDBProperty(typeof(DimensionTypeConverter))]
        public DimensionType Dimensions
        {
            get; set;
        }
    }

    public class DimensionType
    {
        public decimal Length
        {
            get; set;
        }
        public decimal Height
        {
            get; set;
        }
        public decimal Thickness
        {
            get; set;
        }
    }

    // Converts the complex type DimensionType to string and vice-versa.
    public class DimensionTypeConverter : IPropertyConverter
    {
        public DynamoDBEntry ToEntry(object value)
        {
            DimensionType bookDimensions = value as DimensionType;
            if (bookDimensions == null) throw new ArgumentOutOfRangeException();

            string data = string.Format("{1}{0}{2}{0}{3}", " x ",
                            bookDimensions.Length, bookDimensions.Height, bookDimensions.Thickness);

            DynamoDBEntry entry = new Primitive
            {
                Value = data
            };
            return entry;
        }

        public object FromEntry(DynamoDBEntry entry)
        {
            Primitive primitive = entry as Primitive;
            if (primitive == null || !(primitive.Value is String) || string.IsNullOrEmpty((string)primitive.Value))
                throw new ArgumentOutOfRangeException();

            string[] data = ((string)(primitive.Value)).Split(new string[] { " x " }, StringSplitOptions.None);
            if (data.Length != 3) throw new ArgumentOutOfRangeException();

            DimensionType complexData = new DimensionType
            {
                Length = Convert.ToDecimal(data[0]),
                Height = Convert.ToDecimal(data[1]),
                Thickness = Convert.ToDecimal(data[2])
            };
            return complexData;
        }
    }
}
```

# Esecuzione degli esempi di codice in questa guida per gli sviluppatori
<a name="CodeSamples"></a>

 AWS SDKs Forniscono un ampio supporto per Amazon DynamoDB nelle seguenti lingue:
+ [Java](https://aws.amazon.com/sdk-for-java)
+ [JavaScript nel browser](https://aws.amazon.com/sdk-for-browser)
+ [.NET](https://aws.amazon.com/sdk-for-net)
+ [Node.js](https://aws.amazon.com/sdk-for-node-js)
+ [PHP](https://aws.amazon.com/sdk-for-php)
+ [Python](https://aws.amazon.com/sdk-for-python)
+ [Ruby](https://aws.amazon.com/sdk-for-ruby)
+ [C\$1\$1](https://aws.amazon.com/sdk-for-cpp)
+ [Go](https://aws.amazon.com/sdk-for-go)
+ [Android](https://aws.amazon.com/mobile/sdk/)
+ [iOS](https://aws.amazon.com/mobile/sdk/)

L'esempio di codice in questa guida per gli sviluppatori fornisce una copertura più dettagliata delle operazioni di DynamoDB, usando i seguenti linguaggi di programmazione:
+ [Esempi di codice Java](CodeSamples.Java.md)
+ [Esempi di codice .NET](CodeSamples.DotNet.md)

Prima di iniziare con questo esercizio, è necessario creare un AWS account, ottenere la chiave di accesso e la chiave segreta e configurare AWS Command Line Interface (AWS CLI) sul computer. Per ulteriori informazioni, consulta [Configurazione di DynamoDB (servizio Web)](SettingUp.DynamoWebService.md).

**Nota**  
Se si utilizza la versione scaricabile di DynamoDB, è necessario utilizzare la per creare tabelle e dati AWS CLI di esempio. È inoltre necessario specificare il `--endpoint-url` parametro con ogni comando. AWS CLI Per ulteriori informazioni, consulta [Impostazione dell'endpoint locale](DynamoDBLocal.UsageNotes.md#DynamoDBLocal.Endpoint).

# Creazione di tabelle e caricamento di dati per esempi di codice in DynamoDB
<a name="SampleData"></a>

Di seguito sono riportate le nozioni di base sulla creazione di tabelle in DynamoDB, sul caricamento di un set di dati di esempio, sulle query sui dati e sull'aggiornamento dei dati.
+ [Fase 1: creare una tabella DynamoDB](getting-started-step-1.md)
+ [Fase 2: scrivere dati in una tabella DynamoDB](getting-started-step-2.md)
+ [Fase 3: leggere i dati da una tabella DynamoDB](getting-started-step-3.md)
+ [Fase 4: aggiornare i dati in una tabella](getting-started-step-4.md)

# Esempi di codice Java
<a name="CodeSamples.Java"></a>

**Topics**
+ [Java: impostazione delle credenziali AWS](#CodeSamples.Java.Credentials)
+ [Java: impostazione della AWS regione e dell'endpoint](#CodeSamples.Java.RegionAndEndpoint)

Questa guida per gli sviluppatori contiene frammenti di codice e ready-to-run programmi Java. Puoi trovare questi esempi di codice nelle seguenti sezioni:
+ [Utilizzo di elementi e attributi in DynamoDB](WorkingWithItems.md)
+ [Utilizzo di tabelle e dati in DynamoDB](WorkingWithTables.md)
+ [Esecuzione di query in DynamoDB](Query.md)
+ [Scansione di tabelle in DynamoDB](Scan.md)
+ [Miglioramento dell’accesso ai dati con gli indici secondari in DynamoDB](SecondaryIndexes.md)
+ [Java 1.x: Dinamo DBMapper](DynamoDBMapper.md)
+ [Acquisizione dei dati di modifica per DynamoDB Streams](Streams.md)

Puoi iniziare velocemente usando Eclipse con [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/). Oltre a un IDE completo, sono disponibili anche aggiornamenti automatici e modelli preconfigurati per la AWS SDK per Java creazione di applicazioni. AWS 

**Per eseguire esempi di codice Java (usando Eclipse)**

1. Scaricare e installare l'IDE [Eclipse](http://www.eclipse.org);

1. Scarica e installa [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/).

1. Avviare Eclipse e dal menu **Eclipse** scegliere **File**, **New (Nuovo)** e quindi **Other (Altro)**.

1. In **Seleziona una procedura guidata**, scegli **AWS**, quindi **Progetto Java per AWS **, infine **Successivo**.

1. In **Crea un AWS Java, procedi** come segue:

   1. In **Project name (Nome progetto)** immettere un nome per il progetto.

   1. In **Select Account (Seleziona un account)** scegliere il profilo per le credenziali dall'elenco.

      Se è la prima volta che utilizzi il [AWS Toolkit for Eclipse](https://aws.amazon.com/eclipse/), scegli **Configura AWS account per configurare** AWS le credenziali.

1. Scegli **Fine** per creare il progetto.

1. Dal menu **Eclipse** scegliere **File**, **New (Nuovo)** e infine **Class (Classe)**.

1. In **Java Class** immettere un nome per la classe in **Name (Nome)** (usare lo stesso nome dell'esempio di codice che si desidera eseguire) e infine scegliere **Finish (Fine)** per creare la classe.

1. Copiare l'esempio di codice dalla pagina della documentazione nell'editor di Eclipse.

1. Per eseguire il codice, scegliere **Run (Esegui)** nel menu Eclipse.

L'SDK per Java fornisce client sicuri per lavorare con DynamoDB. Come best practice, le tue applicazioni dovrebbero creare un client e riutilizzarlo tra i thread.

Per ulteriori informazioni, consulta [AWS SDK per Java](https://aws.amazon.com/sdk-for-java).

**Nota**  
Gli esempi di codice in questa guida sono pensati per l'utilizzo con la versione più recente di AWS SDK per Java.  
Se si utilizza AWS Toolkit for Eclipse, è possibile configurare gli aggiornamenti automatici per l'SDK for Java. Per farlo in Eclipse, vai su **Preferenze** e scegli **Kit di strumenti AWS****Scarica nuovo SDKs automaticamente**. **AWS SDK per Java**

## Java: impostazione delle credenziali AWS
<a name="CodeSamples.Java.Credentials"></a>

L'SDK for Java richiede l'immissione di AWS credenziali all'applicazione in fase di esecuzione. *Gli esempi di codice in questa guida presuppongono che stiate utilizzando un file di AWS credenziali, come descritto in [Configurazione delle AWS credenziali nella Guida per gli](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/set-up-creds.html) sviluppatori.AWS SDK per Java *

Di seguito è riportato un esempio di file di AWS credenziali denominato`~/.aws/credentials`, in cui il carattere tilde (`~`) rappresenta la directory home.

```
[default]
aws_access_key_id = AWS access key ID goes here
aws_secret_access_key = Secret key goes here
```

## Java: impostazione della AWS regione e dell'endpoint
<a name="CodeSamples.Java.RegionAndEndpoint"></a>

Per impostazione predefinita, gli esempi di codice accedono a DynamoDB nella regione Stati Uniti occidentali (Oregon). Puoi modificare la regione modificando le proprietà `AmazonDynamoDB`.

Il seguente esempio di codice crea un'istanza di un nuovo `AmazonDynamoDB`.

```
import software.amazon.dynamodb.AmazonDynamoDBClientBuilder;
import com.amazonaws.regions.Regions;
...
// This client will default to US West (Oregon)
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.US_WEST_2)
.build();
```

È possibile utilizzare il metodo `withRegion` per eseguire il codice in DynamoDB in ogni regione in cui sia disponibile. Per l'elenco completo, consulta [Regioni ed endpoint AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) in *Riferimenti generali di Amazon Web Services*.

Se si desidera eseguire gli esempi di codice usando DynamoDB in locale sul computer, impostare l'endpoint come riportato di seguito:

### AWS SDK V1
<a name="CodeSamples.Java.RegionAndEndpoint.V1"></a>

```
AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard().withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration("http://localhost:8000", "us-west-2"))
.build();
```

### AWS SDK V2
<a name="CodeSamples.Java.RegionAndEndpoint.V2"></a>

```
DynamoDbClient client = DynamoDbClient.builder()
    .endpointOverride(URI.create("http://localhost:8000"))
    // The region is meaningless for local DynamoDb but required for client builder validation
    .region(Region.US_EAST_1)
    .credentialsProvider(StaticCredentialsProvider.create(
    AwsBasicCredentials.create("dummy-key", "dummy-secret")))
    .build();
```

# Esempi di codice .NET
<a name="CodeSamples.DotNet"></a>

**Topics**
+ [.NET: impostazione delle credenziali AWS](#CodeSamples.DotNet.Credentials)
+ [.NET: impostazione della AWS regione e dell'endpoint](#CodeSamples.DotNet.RegionAndEndpoint)

Questa guida contiene frammenti di codice.NET e programmi. ready-to-run Puoi trovare questi esempi di codice nelle seguenti sezioni:
+ [Utilizzo di elementi e attributi in DynamoDB](WorkingWithItems.md)
+ [Utilizzo di tabelle e dati in DynamoDB](WorkingWithTables.md)
+ [Esecuzione di query in DynamoDB](Query.md)
+ [Scansione di tabelle in DynamoDB](Scan.md)
+ [Miglioramento dell’accesso ai dati con gli indici secondari in DynamoDB](SecondaryIndexes.md)
+ [Utilizzo del modello documentale .NET in DynamoDB](DotNetSDKMidLevel.md)
+ [Operazioni con il modello di persistenza degli oggetti di .NET e DynamoDB](DotNetSDKHighLevel.md)
+ [Acquisizione dei dati di modifica per DynamoDB Streams](Streams.md)

Puoi iniziare rapidamente utilizzando il AWS SDK per .NET Toolkit for Visual Studio.

**Esecuzione degli esempi di codice .NET (usando Visual Studio)**

1. Scaricare e installare [Microsoft Visual Studio](https://www.visualstudio.com).

1. (Facoltativo) Scarica e installa il [Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/).

1. Configura le tue AWS credenziali. Configura un profilo di credenziali nel tuo file di AWS credenziali condiviso (). `~/.aws/credentials` Per ulteriori informazioni, consulta [Configurazione delle credenziali di AWS](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html) nella *Guida per gli sviluppatori di AWS SDK per .NET *.

1. Avvia Visual Studio. Scegli **File**, **Nuovo**, **Progetto**.

1. **Cerca **l'app Console**, seleziona il modello C\$1 destinato a .NET, quindi scegli Avanti.** Configura il nome e la posizione del progetto, quindi scegli **Crea**.

1. Aggiungi il pacchetto AWS SDK per NuGet DynamoDB al tuo progetto:

   1. **In Solution Explorer, apri il menu contestuale (fai clic con il pulsante destro del mouse) per il tuo progetto, quindi scegli Gestisci pacchetti. NuGet**

   1. In NuGet Package Manager, scegli **Browse**.

   1. Nella casella di ricerca, immettere **AWSSDK.DynamoDBv2** e attendere il completamento della ricerca.

   1. **Scegli **AWSSDK.Dynamo DBv2**, quindi scegli Installa.**

1. Nel tuo progetto Visual Studio, apri. `Program.cs` Sostituisci il contenuto con l'esempio di codice dalla pagina di documentazione che desideri eseguire.

1. Per eseguire il codice, scegliere **Start** nella barra degli strumenti di Visual Studio.

 SDK per .NET Fornisce client thread-safe per lavorare con DynamoDB. Come best practice, le tue applicazioni dovrebbero creare un client e riutilizzarlo tra i thread.

Per ulteriori informazioni, consulta [AWS SDK for .NET](https://aws.amazon.com/sdk-for-net).

**Nota**  
Gli esempi di codice in questa guida sono pensati per l'utilizzo con la versione più recente di AWS SDK per .NET.

## .NET: impostazione delle credenziali AWS
<a name="CodeSamples.DotNet.Credentials"></a>

È SDK per .NET necessario fornire AWS le credenziali all'applicazione in fase di esecuzione. *Gli esempi di codice in questa guida presuppongono che stiate utilizzando SDK Store per gestire il file AWS delle credenziali, come descritto in [Uso dell'SDK store](https://docs.aws.amazon.com/sdk-for-net/v3/developer-guide/net-dg-config-creds.html#sdk-store) nella Developer Guide.AWS SDK per .NET *

Toolkit for Visual Studio supporta più set di credenziali da qualsiasi numero di account. Ogni set viene definito *profilo*. Visual Studio aggiunge voci al `App.config` file del progetto in modo che l'applicazione possa trovare le AWS credenziali in fase di esecuzione.

L'esempio seguente mostra il file `App.config` predefinito che viene generato quando si crea un nuovo progetto usando Toolkit for Visual Studio.

```
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <appSettings>
    <add key="AWSProfileName" value="default"/>
    <add key="AWSRegion" value="us-west-2" />
 </appSettings>
</configuration>
```

In fase di esecuzione, il programma utilizza il `default` set di AWS credenziali, come specificato dalla `AWSProfileName` voce. Le AWS credenziali stesse vengono conservate nell'SDK Store in forma crittografata. Toolkit for Visual Studio fornisce un'interfaccia grafica dell'utente per gestire le credenziali, tutto all'interno di Visual Studio. Per ulteriori informazioni, consulta [Specifica delle credenziali](https://docs.aws.amazon.com/AWSToolkitVS/latest/UserGuide/tkv_setup.html#creds) nella *Guida per l'utente di AWS Toolkit for Visual Studio *.

**Nota**  
Per impostazione predefinita, gli esempi di codice accedono a DynamoDB nella regione Stati Uniti occidentali (Oregon). Puoi cambiare la regione modificando la voce `AWSRegion` nel file App.config. È possibile impostare `AWSRegion` su qualsiasi regione in cui è disponibile DynamoDB. Per l'elenco completo, consulta [Regioni ed endpoint AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) in *Riferimenti generali di Amazon Web Services*.

## .NET: impostazione della AWS regione e dell'endpoint
<a name="CodeSamples.DotNet.RegionAndEndpoint"></a>

Per impostazione predefinita, gli esempi di codice accedono a DynamoDB nella regione Stati Uniti occidentali (Oregon). Puoi cambiare la regione modificando la voce `AWSRegion` nel file `App.config`. Oppure, puoi modificare la regione modificando le proprietà `AmazonDynamoDBClient`.

Il seguente esempio di codice crea un'istanza di un nuovo `AmazonDynamoDBClient`. Il client viene modificato in modo che il codice venga eseguito in DynamoDB in una regione differente.

```
AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();
// This client will access the US East 1 region.
clientConfig.RegionEndpoint = RegionEndpoint.USEast1;
AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);
```

Per l'elenco completo delle regioni, consulta [Regioni ed endpoint AWS](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) in *Riferimenti generali di Amazon Web Services*.

Se si desidera eseguire gli esempi di codice usando DynamoDB in locale sul computer, impostare l'endpoint come riportato di seguito:

```
AmazonDynamoDBConfig clientConfig = new AmazonDynamoDBConfig();
// Set the endpoint URL
clientConfig.ServiceURL = "http://localhost:8000";
AmazonDynamoDBClient client = new AmazonDynamoDBClient(clientConfig);
```

# API DynamoDB di basso livello
<a name="Programming.LowLevelAPI"></a>

L'*API di basso livello* di Amazon DynamoDB è l'interfaccia a livello di protocollo per DynamoDB. A questo livello, ogni richiesta HTTP(S) deve essere formattata correttamente e contenere una firma digitale valida.

Creano AWS SDKs richieste API DynamoDB di basso livello per tuo conto ed elaborano le risposte di DynamoDB. Ciò ti consente di concentrarti sulla logica dell'applicazione, anziché sui dettagli di basso livello. Tuttavia, può essere comunque utile sapere in grandi linee come funziona l'API di livello basso di DynamoDB.

Per ulteriori informazioni sull'API DynamoDB di basso livello, consulta[Documentazione di riferimento dell'API Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/).

**Nota**  
DynamoDB Streams dispone di una propria API di basso livello, che è separata da quella di DynamoDB ed è completamente supportata da. AWS SDKs  
Per ulteriori informazioni, consulta [Acquisizione dei dati di modifica per DynamoDB Streams](Streams.md). Per informazioni sull'API DynamoDB Streams di basso livello, consulta la documentazione[Riferimento API Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB_Streams.html).

L'API DynamoDB di basso livello JavaScript utilizza Object Notation (JSON) come formato di protocollo wire. Con il formato JSON, i dati vengono presentati secondo una gerarchia che consente di trasmettere simultaneamente i valori dei dati e la struttura corrispondente. Le coppie nome-valore sono definite nel formato `name:value`. La gerarchia dei dati viene definita tramite parentesi annidate di coppie nome-valore.

DynamoDB usa JSON solo come protocollo di trasporto e non come formato di archiviazione. AWS SDKs Utilizzano JSON per inviare dati a DynamoDB e DynamoDB risponde con JSON. DynamoDB non memorizza i dati in modo persistente in formato JSON.

**Nota**  
Per ulteriori informazioni su JSON, consulta [Presentazione di JSON](http://json.org) nel sito Web `JSON.org`.

**Topics**
+ [Formato della richiesta](#Programming.LowLevelAPI.RequestFormat)
+ [Formato della risposta](#Programming.LowLevelAPI.ResponseFormat)
+ [Descrittori del tipo di dati](#Programming.LowLevelAPI.DataTypeDescriptors)
+ [Dati numerici](#Programming.LowLevelAPI.Numbers)
+ [Dati binari](#Programming.LowLevelAPI.Binary)

![\[API di basso livello di DynamoDB e AWS SDKs come gestire le richieste e le risposte a livello di protocollo.\]](http://docs.aws.amazon.com/it_it/amazondynamodb/latest/developerguide/images/SDKSupport.DDBLowLevelAPI.png)


## Formato della richiesta
<a name="Programming.LowLevelAPI.RequestFormat"></a>

L'API di basso livello di DynamoDB accetta le richieste HTTP(S) `POST` come input. Quindi AWS SDKs costruiscono queste richieste per te.

Supponiamo di avere una tabella denominata `Pets` con uno schema di chiave costituito da `AnimalType` (chiave di partizione) e `Name` (chiave di ordinamento). Entrambi questi attributi sono di tipo `string`. Per recuperare un elemento da`Pets`, l' AWS SDK costruisce la seguente richiesta.

```
POST / HTTP/1.1
Host: dynamodb.<region>.<domain>;
Accept-Encoding: identity
Content-Length: <PayloadSizeBytes>
User-Agent: <UserAgentString>
Content-Type: application/x-amz-json-1.0
Authorization: AWS4-HMAC-SHA256 Credential=<Credential>, SignedHeaders=<Headers>, Signature=<Signature>
X-Amz-Date: <Date> 
X-Amz-Target: DynamoDB_20120810.GetItem

{
    "TableName": "Pets",
    "Key": {
        "AnimalType": {"S": "Dog"},
        "Name": {"S": "Fido"}
    }
}
```

Tieni presente le seguenti considerazioni sulla richiesta:
+ L'intestazione `Authorization` contiene le informazioni necessarie per l'autenticazione della richiesta da parte di DynamoDB. Per ulteriori informazioni, consulta [Signing AWS API request](https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html) e [Signature Version 4 Procedura di firma](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) in. *Riferimenti generali di Amazon Web Services*
+ L'intestazione `X-Amz-Target` contiene il nome di un'operazione DynamoDB: `GetItem`. Il nome è accompagnato dalla versione API di basso livello, in questo caso `20120810`.
+ Il payload (corpo) della richiesta contiene i parametri per l'operazione in formato JSON. Per l'operazione `GetItem`, i parametri sono `TableName` e `Key`.

## Formato della risposta
<a name="Programming.LowLevelAPI.ResponseFormat"></a>

Al ricevimento della richiesta, DynamoDB la elabora e restituisce una risposta. Per la richiesta mostrata in precedenza, il payload della risposta HTTP(S) contiene i risultati dell'operazione, come mostrato nell'esempio seguente:

```
HTTP/1.1 200 OK
x-amzn-RequestId: <RequestId>
x-amz-crc32: <Checksum>
Content-Type: application/x-amz-json-1.0
Content-Length: <PayloadSizeBytes>
Date: <Date>
{
    "Item": {
        "Age": {"N": "8"},
        "Colors": {
            "L": [
                {"S": "White"},
                {"S": "Brown"},
                {"S": "Black"}
            ]
        },
        "Name": {"S": "Fido"},
        "Vaccinations": {
            "M": {
                "Rabies": {
                    "L": [
                        {"S": "2009-03-17"},
                        {"S": "2011-09-21"},
                        {"S": "2014-07-08"}
                    ]
                },
                "Distemper": {"S": "2015-10-13"}
            }
        },
        "Breed": {"S": "Beagle"},
        "AnimalType": {"S": "Dog"}
    }
}
```

A questo punto, l' AWS SDK restituisce i dati di risposta all'applicazione per un'ulteriore elaborazione.

**Nota**  
Se l'esecuzione della richiesta non riesce, DynamoDB restituisce un codice di errore HTTP e un messaggio di errore. L'SDK AWS propaga la risposta all'applicazione sotto forma di eccezione. Per ulteriori informazioni, consulta [Gestione degli errori con DynamoDB](Programming.Errors.md).

## Descrittori del tipo di dati
<a name="Programming.LowLevelAPI.DataTypeDescriptors"></a>

Il protocollo API di basso livello di DynamoDB richiede che ogni attributo sia accompagnato da un descrittore del tipo di dati. I *descrittori del tipo di dati* sono token che indicano a DynamoDB come interpretare ogni attributo.

Gli esempi in [Formato della richiesta](#Programming.LowLevelAPI.RequestFormat) e [Formato della risposta](#Programming.LowLevelAPI.ResponseFormat) mostrano come vengono usati i descrittori del tipo di dati. La richiesta `GetItem` specifica `S` per gli attributi dello schema della chiave `Pets` (`AnimalType` e `Name`) che sono di tipo `string`. La risposta `GetItem` contiene un item *Pets* con attributi di tipo `string` (`S`), `number` (`N`), `map` (`M`) e `list` (`L`).

Di seguito è riportato un elenco completo dei descrittori del tipo di dati di DynamoDB:
+ **`S`**: String
+ **`N`**: Number
+ **`B`**: binario
+ **`BOOL`**: Boolean
+ **`NULL`**: null
+ **`M`**: Map
+ **`L`**: list
+ **`SS`**: set string
+ **`NS`**: set numerico
+ **`BS`**: set binario

La tabella seguente mostra il formato JSON corretto per ogni descrittore di tipo di dati. Nota che i numeri sono rappresentati come stringhe per preservare la precisione, mentre i valori booleani e nulli utilizzano i loro tipi JSON nativi.


| Descrittore | Formato JSON | Note | 
| --- | --- | --- | 
| S | \$1"S": "Hello"\$1 | Il valore è una stringa JSON. | 
| N | \$1"N": "123.45"\$1 | Il valore è una stringa, non un numero JSON. Ciò consente di preservare la precisione in tutte le lingue. | 
| B | \$1"B": "dGhpcyBpcyBhIHRlc3Q="\$1 | Il valore è una stringa codificata in base64. | 
| BOOL | \$1"BOOL": true\$1 | Il valore è un booleano JSON (or), non una stringa. true false | 
| NULL | \$1"NULL": true\$1 | Il valore è il true booleano JSON che indica null. | 
| M | \$1"M": \$1"Name": \$1"S": "Joe"\$1\$1\$1 | Il valore è un oggetto JSON composto da coppie nome-valore dell'attributo. | 
| L | \$1"L": [\$1"S": "Red"\$1, \$1"N": "5"\$1]\$1 | Il valore è una matrice JSON di valori di attributo. | 
| SS | \$1"SS": ["Red", "Blue"]\$1 | Il valore è un array di stringhe JSON. | 
| NS | \$1"NS": ["1", "2.5"]\$1 | Il valore è una matrice JSON di stringhe numeriche. | 
| BS | \$1"BS": ["U3Vubnk=", "UmFpbnk="]\$1 | Il valore è un array JSON di stringhe con codifica base64. | 

**Nota**  
 Per una descrizione dettagliata dei tipi di dati di DynamoDB, consulta [Tipi di dati](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes).

## Dati numerici
<a name="Programming.LowLevelAPI.Numbers"></a>

I vari linguaggi di programmazione offrono diversi livelli di supporto per JSON. In alcuni casi, potresti decidere di utilizzare una libreria di terze parti per convalidare e analizzare i documenti JSON.

Alcune librerie di terze parti si basano sul tipo di numero JSON, fornendo i propri tipi come `int`, `long` o `double`. Tuttavia, dal momento che il tipo di dati numerico nativo in DynamoDB non viene esattamente mappato a questi altri tipi di dati, pertanto queste distinzioni tra tipi possono causare conflitti. Inoltre, molte librerie JSON non gestiscono valori numerici a precisione fissa e deducono automaticamente un doppio tipo di dati per le sequenze di cifre che contengono una virgola decimale.

Per risolvere questi problemi, DynamoDB fornisce un singolo tipo numerico senza perdita di dati. Per evitare conversioni implicite indesiderate a un valore double, DynamoDB usa le stringhe per il trasferimento dei dati di valori numerici. Questo approccio fornisce flessibilità per l'aggiornamento dei valori degli attributi pur mantenendo una corretta semantica di ordinamento, ad esempio mettendo i valori "01", "2" e "03" nella sequenza corretta.

Se la precisione del numero è importante per l'applicazione, sarà necessario convertire i valori numerici in stringhe prima di passarli a DynamoDB.

## Dati binari
<a name="Programming.LowLevelAPI.Binary"></a>

 supporta gli attributi binari. Tuttavia, JSON non supporta in modo nativo la codifica dei dati binari. Per inviare dati binari in una richiesta, è necessario codificarli nel formato Base64. Dopo aver ricevuto la richiesta, DynamoDB decodifica i dati Base64 nuovamente in binario. 

Lo schema di codifica base64 utilizzato da DynamoDB è descritto in [RFC 4648](http://tools.ietf.org/html/rfc4648) sul sito Web Internet Engineering Task Force (IETF).