

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Higher-Level-Programmierschnittstellen für DynamoDB
<a name="HigherLevelInterfaces"></a>

 AWS SDKs Sie bieten Anwendungen mit Low-Level-Schnittstellen für die Arbeit mit Amazon DynamoDB. Diese clientseitigen Klassen und Methoden entsprechen direkt der Low-Level-API von DynamoDB API. Doch viele Entwickler stellen *Impedanzfehlanpassungen* fest, wenn sie Elementen in einer Datenbanktabelle komplexe Datentypen zuordnen müssen. Mit einer Low-Level-Datenbankschnittstelle müssen Entwickler Methoden zum Lesen oder Schreiben von Objektdaten in Datenbanktabellen und umgekehrt entwickeln. Die Menge des zusätzlich erforderlichen Codes für jede Kombination aus Objekttyp und Datenbanktabelle kann überwältigend erscheinen.

Um die Entwicklung zu vereinfachen, bieten die AWS SDKs für Java und .NET zusätzliche Schnittstellen mit höheren Abstraktionsebenen. Mit den High-Level-Schnittstellen für DynamoDB-Objekte können Sie die Beziehungen zwischen Objekten in Ihrem Programm und den Datenbanktabellen definieren, die die Daten dieser Objekte speichern. Nachdem Sie diese Mappings definiert haben, rufen Sie einfache Objektmethoden wie `save`, `load` oder `delete` auf. Die zugrunde liegenden DynamoDB-Low-Level-Operationen werden dann in Ihrem Namen automatisch aufgerufen. Auf diese Weise können Sie objektorientierte Codes statt datenbankorientierter Codes schreiben.

Die übergeordneten Programmierschnittstellen für DynamoDB sind in den Versionen AWS SDKs für Java und .NET verfügbar.

**Java**
+ [Java 1.x: Dynamo DBMapper](DynamoDBMapper.md)
+ [Java 2.x: Erweiterter DynamoDB-Client](DynamoDBEnhanced.md)

**.NET**
+ [Arbeiten dem .NET-Dokumentmodell in DynamoDB](DotNetSDKMidLevel.md)
+ [Arbeiten mit dem Object Persistence-Modell von .NET und DynamoDB](DotNetSDKHighLevel.md)

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

**Anmerkung**  
Das SDK für Java ist in zwei Versionen verfügbar: 1.x und 2.x. Die Version end-of-support für 1.x wurde [am 12. Januar 2024 angekündigt](https://aws.amazon.com/blogs/developer/announcing-end-of-support-for-aws-sdk-for-java-v1-x-on-december-31-2025/). Es wird und end-of-support ist am 31. Dezember 2025 fällig. Für Neuentwicklungen wird die Verwendung von Version 2.x empfohlen.

Die AWS SDK für Java stellt eine `DynamoDBMapper` Klasse bereit, mit der Sie Ihre clientseitigen Klassen Amazon DynamoDB-Tabellen zuordnen können. Um `DynamoDBMapper` zu verwenden, definieren Sie die Beziehung zwischen Elementen in einer DynamoDB-Tabelle und ihren entsprechenden Objekt-Instances im Code. Die `DynamoDBMapper`-Klasse ermöglicht Ihnen auch die Ausführung verschiedener Create-, Read-, Update-, und Delete-Operationen (CRUD) für Elemente sowie das Ausführen von Abfragen und Scans für Tabellen.

**Topics**
+ [Dynamo-Klasse DBMapper](DynamoDBMapper.Methods.md)
+ [Unterstützte Datentypen für Dynamo DBMapper für Java](DynamoDBMapper.DataTypes.md)
+ [Java-Anmerkungen für DynamoDB](DynamoDBMapper.Annotations.md)
+ [Optionale Konfigurationseinstellungen für Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md)
+ [DynamoDB und optimistische Sperren mit Versionsnummer](DynamoDBMapper.OptimisticLocking.md)
+ [Zuordnen willkürlicher Daten in DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md)
+ [Beispiele für DynamoDBMapper](DynamoDBMapper.Examples.md)

**Anmerkung**  
Die `DynamoDBMapper`-Klasse erlaubt kein Erstellen, Aktualisieren oder Löschen von Tabellen. Zum Ausführen dieser Aufgaben verwenden Sie stattdessen die Low-Level-SDK-für-Java-Schnittstelle. 

Das SDK für Java stellt eine Reihe von Anmerkungstypen bereit, damit Sie Ihre Klassen zu Tabellen zuweisen können. Betrachten Sie beispielsweise eine `ProductCatalog`-Tabelle, die `Id` als Partitionsschlüssel verwendet. 

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

Sie können der `ProductCatalog`-Tabelle eine Klasse in Ihrer Client-Anwendung zuweisen wie im folgenden Java-Code gezeigt. Diese Code definiert ein Plain Old Java Object (POJO) mit dem Namen `CatalogItem`, das Anmerkungen verwendet, um Objektfelder zu DynamoDB-Attributnamen zuzuweisen:

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

Im vorherigen Code weist die Anmerkung `@DynamoDBTable` die Klasse `CatalogItem` der Tabelle `ProductCatalog` zu. Sie können einzelne Klassen-Instances als Elemente in der Tabelle speichern. Die Anmerkung `@DynamoDBHashKey` weist die Eigenschaft `Id` dem Primärschlüssel zu. 

Standardmäßig sind die Klasseneigenschaften denselben Attributnamen in der Tabelle zugeordnet. Die Eigenschaften `Title` und `ISBN` sind den gleichen Attributnamen in der Tabelle zugeordnet. 

Die `@DynamoDBAttribute`-Anmerkung ist optional, wenn der Name des DynamoDB-Attributs dem Namen der in der Klasse angegebenen Eigenschaft entspricht. Wenn sich die Namen unterscheiden, verwenden Sie diese Anmerkung mit dem Parameter `attributeName`, um anzugeben, mit welchem DynamoDB-Attribut diese Eigenschaft übereinstimmt. 

Im vorangegangenen Beispiel wird jeder Eigenschaft die Annotation `@DynamoDBAttribute` hinzugefügt, um sicherzustellen, dass Eigenschaftsnamen genau den Tabellen entsprechen, die in einem vorherigen Schritt erstellt wurden und um die Attributnamen, die in anderen Codebeispielen in diesem Handbuch verwendet werden, einzuhalten. 

Ihre Klassendefinition kann Eigenschaften besitzen, die keinen Attributen in der Tabelle zugeordnet sind. Sie erkennen diese Eigenschaften, indem Sie die `@DynamoDBIgnore`-Anmerkung hinzufügen. Im vorangegangenen Beispiel ist die `SomeProp`-Eigenschaft mit der `@DynamoDBIgnore`-Anmerkung gekennzeichnet. Wenn Sie eine `CatalogItem`-Instance in die Tabelle hochladen, enthält Ihre `DynamoDBMapper`-Instance die Eigenschaft `SomeProp` nicht. Darüber hinaus gibt der Mapper dieses Attribut nicht zurück, wenn Sie ein Element aus der Tabelle abrufen. 

Nachdem Sie die Mappingklasse definierthaben, können Sie `DynamoDBMapper`-Methoden verwenden, um eine Instance dieser Klasse zu einem entsprechenden Element in der Tabelle `Catalog` zu schreiben. Das folgende Codebeispiel zeigt diese Technik.

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

Im folgenden Codebeispiel wird gezeigt, wie Sie das Element abrufen und auf einige seiner Attribute zugreifen.

```
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` ermöglicht ein intuitives und natürliches Arbeiten mit DynamoDB-Daten in Java. Er bietet auch verschiedene integrierte Funktionen wie optimistische Sperre, ACID-Transaktionen, automatisch generierte Partitions- und Sortierschlüsselwerte sowie Objektversionierung.

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



Die Klasse A`DynamoDBMapper` ist der Eintrittspunkt für Amazon DynamoDB. Sie stellt Zugriff auf einen DynamoDB-Endpunkt bereit und ermöglicht Ihnen, auf Ihre Daten in verschiedenen Tabellen zuzugreifen. Sie ermöglicht Ihnen auch die Ausführung verschiedener Create-, Read-, Update-, und Delete-Operationen (CRUD) für Elemente sowie das Ausführen von Abfragen und Scans auf Tabellen. Diese Klasse bietet die folgenden Methoden für die Arbeit mit DynamoDB.

*Die entsprechende Javadoc-Dokumentation finden Sie unter [Dynamo DBMapper](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBMapper.html) in der API-Referenz.AWS SDK für Java *

**Topics**
+ [save](#DynamoDBMapper.Methods.save)
+ [load](#DynamoDBMapper.Methods.load)
+ [delete](#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)
+ [generateCreateTableAnfrage](#DynamoDBMapper.Methods.generateCreateTableRequest)
+ [createS3Link](#DynamoDBMapper.Methods.createS3Link)
+ [GetS3 ClientCache](#DynamoDBMapper.Methods.getS3ClientCache)

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

Speichert das angegebene Objekt in der Tabelle. Das Objekt, das Sie speichern möchten, ist der einzige erforderliche Parameter für diese Methode. Sie können optionale Konfigurationsparameter mithilfe des `DynamoDBMapperConfig`-Objekts bereitstellen. 

Wenn ein Element mit demselben Primärschlüssel nicht vorhanden ist, erstellt diese Methode ein neues Element in der Tabelle. Wenn ein Element mit demselben Primärschlüssel vorhanden ist, aktualisiert sie das vorhandene Element. Wenn der Partitions- und Sortierschlüssel den Typ String haben und mit `@DynamoDBAutoGeneratedKey` angemerkt sind, erhalten sie einen Random Universally Unique Identifier (UUID), wenn sie nicht initialisiert werden. Versionsfelder, die mit `@DynamoDBVersionAttribute` angemerkt sind, werden um eins erhöht. Wenn ein Versionsfeld aktualisiert oder ein Schlüssel generiert wird, wird das übergebene Objekt als Folge der Operation aktualisiert. 

Standardmäßig werden nur Attribute aktualisiert, die Eigenschaften der zugewiesenen Klasse entsprechen. Zusätzlich für ein Element vorhandene Attribute sind nicht betroffen. Wenn Sie jedoch `SaveBehavior.CLOBBER` angeben, können Sie die vollständige Überschreibung des Elements erzwingen.

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

Wenn Versioning aktiviert ist, müssen die client- und serverseitigen Elementversionen übereinstimmen. Jedoch muss die Version nicht übereinstimmen, wenn die Option `SaveBehavior.CLOBBER` verwendet wird. Weitere Informationen über das Versioning finden Sie unter [DynamoDB und optimistische Sperren mit Versionsnummer](DynamoDBMapper.OptimisticLocking.md).

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

Ruft ein Element aus einer Tabelle ab. Sie müssen den Primärschlüssel des Elements bereitstellen, das Sie abrufen möchten. Sie können optionale Konfigurationsparameter mithilfe des `DynamoDBMapperConfig`-Objekts bereitstellen. Beispielsweise können Sie optional Strongly Consistent-Lesevorgänge anfordern, um sicherzustellen, dass diese Methode ausschließlich die neuesten Elementwerte, wie in der folgenden Java-Anweisung dargestellt, bereitstellt. 

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

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

Standardmäßig gibt DynamoDB das Element zurück, das über Eventually-Consistent-Werte verfügt. Weitere Informationen über das Eventual-Consistency-Modell von DynamoDB finden Sie unter [DynamoDB-Lesekonsistenz](HowItWorks.ReadConsistency.md).

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

Löscht ein Element aus der Tabelle. Sie müssen eine Objekt-Instance aus der zugeordneten Klasse übergeben. 

Wenn Versioning aktiviert ist, müssen die client- und serverseitigen Elementversionen übereinstimmen. Jedoch muss die Version nicht übereinstimmen, wenn die Option `SaveBehavior.CLOBBER` verwendet wird. Weitere Informationen zum Versioning finden Sie unter [DynamoDB und optimistische Sperren mit Versionsnummer](DynamoDBMapper.OptimisticLocking.md). 

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

Fragt eine Tabelle oder einen sekundären Index ab.

Angenommen, Sie verfügen über die Tabelle `Reply`, die Antworten für Forum-Threads speichert. Jedes Thread-Thema kann null oder mehr Antworten enthalten. Der Primärschlüssel der Tabelle `Reply` besteht aus den Feldern `Id` und `ReplyDateTime`, wobei `Id` der Partitionsschlüssel und `ReplyDateTime` der Sortierschlüssel des Primärschlüssels ist.

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

Angenommen, Sie haben eine Mapping zwischen der Klasse `Reply` und der entsprechenden Tabelle `Reply` in DynamoDB erstellt. Der folgende Java-Code verwendet `DynamoDBMapper`, um alle Antworten der letzten zwei Wochen zu einem bestimmten Thread-Thema zu finden.

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

Die Abfrage gibt eine Sammlung von `Reply`-Objekten zurück. 

Die `query`-Methode gibt standardmäßig eine "lazy-loaded"-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie die Sammlung `latestReplies` durchlaufen. 

Beachten Sie, dass beim Aufrufen der `size()`-Methode für die Sammlung jedes Ergebnis geladen wird, um eine genaue Zählung zu liefern. Dies kann dazu führen, dass viel bereitgestellter Durchsatz verbraucht wird, und bei einer sehr großen Tabelle könnte sogar der gesamte Speicher in Ihrer JVM ausgeschöpft werden.

Für eine Indexabfrage müssen Sie zuerst den Index als eine Mapper-Klasse modellieren. *Angenommen, die `Reply` Tabelle hat einen globalen sekundären Index namens -Message-Index. PostedBy* Der Partitionsschlüssel für diesen Index ist `PostedBy` und der Sortierschlüssel ist `Message`. Die Klassendefinition für ein Element im Index würde wie folgt aussehen.

```
@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.
}
```

Die Anmerkung `@DynamoDBTable` gibt an, dass dieser Index mit der Tabelle `Reply` verknüpft ist. Die `@DynamoDBIndexHashKey` Anmerkung bezeichnet den Partitionsschlüssel (*PostedBy*) des Indexes und `@DynamoDBIndexRangeKey` den Sortierschlüssel (*Message*) des Indexes.

Sie können jetzt `DynamoDBMapper` nutzen, um den Index abzufragen, der eine Teilmenge der Nachrichten, die von einem bestimmten Benutzer gepostet wurden, abruft. Sie müssen den Indexnamen nicht angeben, wenn Sie keine widersprüchlichen Zuordnungen zwischen Tabellen und Indizes haben und die Zuordnungen bereits im Mapper vorgenommen wurden. Der Mapper leitet anhand des Primärschlüssels und des Sortierschlüssels ab. Der folgende Code fragt den globalen sekundären Index ab. Da globale sekundäre Indizes Eventually Consistent-Lesevorgänge, jedoch keine Strongly Consistent-Lesevorgänge unterstützen, müssen Sie `withConsistentRead(false)` angeben.

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

Die Abfrage gibt eine Sammlung von `PostedByMessage`-Objekten zurück.

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

Fragt eine Tabelle oder einen sekundären Index ab und gibt eine einzelne Seite der übereinstimmenden Ergebnisse zurück. Ebenso wie bei der `query`-Methode, müssen Sie einen Partitions-Schlüsselwert und einen Abfragefilter angeben, der auf das Sortierschlüsselattribut angewendet wird. `queryPage` gibt jedoch ausschließlich die erste „Seite“ der Daten zurück, d. h. Menge von Daten, die in 1 MB passt. 

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

Scannt eine gesamte Tabelle oder einen sekundären Index. Sie können optional einen `FilterExpression` angeben, um den Ergebnissatz zu filtern.

Angenommen, Sie verfügen über die Tabelle `Reply`, die Antworten für Forum-Threads speichert. Jedes Thread-Thema kann null oder mehr Antworten enthalten. Der Primärschlüssel der Tabelle `Reply` besteht aus den Feldern `Id` und `ReplyDateTime`, wobei `Id` der Partitionsschlüssel und `ReplyDateTime` der Sortierschlüssel des Primärschlüssels ist.

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

Wenn Sie der Tabelle `Reply` eine Java-Klasse zugewiesen haben, können Sie `DynamoDBMapper` verwenden, um die Tabelle zu scannen. Der folgende Java-Code scannt beispielsweise die gesamte Tabelle `Reply` und gibt nur die Antworten für ein bestimmtes Jahr zurück.

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

Die `scan`-Methode gibt standardmäßig eine "lazy-loaded"-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie die Sammlung `replies` durchlaufen.

Beachten Sie, dass beim Aufrufen der `size()`-Methode für die Sammlung jedes Ergebnis geladen wird, um eine genaue Zählung zu liefern. Dies kann dazu führen, dass viel bereitgestellter Durchsatz verbraucht wird, und bei einer sehr großen Tabelle könnte sogar der gesamte Speicher in Ihrer JVM ausgeschöpft werden.

Um einen Index zu scannen, müssen Sie zuerst den Index als eine Mapper-Klasse modellieren. Angenommen, die `Reply`-Tabelle hat einen globalen sekundären Index namens `PostedBy-Message-Index`. Der Partitionsschlüssel für diesen Index ist `PostedBy` und der Sortierschlüssel ist `Message`. Im Abschnitt [query](#DynamoDBMapper.Methods.query) wird eine Mapper-Klasse für diesen Index gezeigt. Sie verwendet die Anmerkungen `@DynamoDBIndexHashKey` und `@DynamoDBIndexRangeKey`, um den Partitions- und Sortierschlüssel des Index anzugeben.

Im folgenden Codebeispiel wird `PostedBy-Message-Index` gescannt. Er verwendet keinen Scan-Filter, sodass alle Elemente im Index an Sie zurückgegeben werden.

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

Scannt eine Tabelle oder einen sekundären Index und gibt eine einzelne Seite der übereinstimmenden Ergebnisse zurück. Ebenso wie bei der `scan`-Methode, können Sie optional einen `FilterExpression` festlegen, um den Ergebnissatz zu filtern. `scanPage` gibt jedoch nur die erste „Seite“ der Daten zurück, d. h. Menge von Daten, die in 1 MB passt.

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

Führt einen parallelen Scan einer gesamten Tabelle oder einem sekundären Index durch. Sie geben eine Reihe von logischen Segmente für die Tabelle zusammen mit einem Scan-Ausdruck an, um Ergebnisse zu filtern. Der `parallelScan` teilt die Scan-Aufgabe unter mehreren Benutzern auf, einer für jedes logische Segment; die Benutzer verarbeiten die Daten parallel und geben die Ergebnisse zurück.

Im folgenden Java-Codebeispiel wird ein paralleler Scan der Tabelle `Product` ausgeführt.

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

Speichert Objekte in eine oder mehrere Tabellen mithilfe eines Aufrufs oder mehrerer Aufrufe der Methode `AmazonDynamoDB.batchWriteItem`. Diese Methode bietet keine Transaktionsgarantien.

Der folgende Java-Code speichert zwei Elemente (Bücher) in der Tabelle `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>

Ruft mehrere Elemente aus einer oder mehreren Tabellen anhand ihrer Primärschlüssel ab.

Der folgende Java-Code ruft zwei Elemente aus zwei verschiedenen Tabellen ab.

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

Löscht Objekte aus einer oder mehreren Tabellen mithilfe einer oder mehrerer Aufrufe der `AmazonDynamoDB.batchWriteItem`-Methode. Diese Methode bietet keine Transaktionsgarantien. 

Der folgende Java-Code löscht zwei Elemente (Bücher) aus der Tabelle `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>

Speichert Objekte in und löscht Objekte aus einer oder mehreren Tabellen mithilfe einer oder mehrerer Aufrufe der `AmazonDynamoDB.batchWriteItem`-Methode. Diese Methode bietet keine Transaktionsgarantien oder Versioning-Support (bedingte Ablege- oder Löschvorgänge).

Der folgende Java-Code schreibt ein neues Element in die Tabelle `Forum`, schreibt ein neues Element in die Tabelle `Thread` und löscht ein Element aus der Tabelle `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>

Speichert Objekte in und löscht Objekte aus mindestens einer Tabelle mithilfe eines Aufrufs der `AmazonDynamoDB.transactWriteItems`-Methode. 

[Eine Liste der transaktionsspezifischen Ausnahmen finden Sie unter Fehler. TransactWriteItems ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html#API_TransactWriteItems_Errors) 

Weitere Informationen zu DynamoDB-Transaktionen und den bereitgestellten Garantien für Atomizität, Konsistenz, Isolation und Beständigkeit (Atomicity, Consistency, Isolation, Durability – ACID) finden Sie unter [Amazon DynamoDB Transactions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

**Anmerkung**  
 Diese Methode unterstützt Folgendes nicht:  
[DBMapperDynamo-Konfiguration. SaveBehavior](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.OptionalConfig.html).

Der folgende Java-Code schreibt transaktional jeweils ein neues Element in die Tabellen `Forum` und `Thread`.

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

Lädt Objekte aus mindestens einer Tabelle mithilfe eines Aufrufs der `AmazonDynamoDB.transactGetItems`-Methode. 

[Eine Liste der transaktionsspezifischen Ausnahmen finden Sie unter Fehler. TransactGetItems ](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html#API_TransactGetItems_Errors) 

Weitere Informationen zu DynamoDB-Transaktionen und den bereitgestellten Garantien für Atomizität, Konsistenz, Isolation und Beständigkeit (Atomicity, Consistency, Isolation, Durability – ACID) finden Sie unter [Amazon DynamoDB Transactions](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transactions.html). 

Der folgende Java-Code lädt transaktional jeweils ein Element aus den Tabellen `Forum` und `Thread`.

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

Bewertet den angegebenen Scanausdruck und gibt die Anzahl der übereinstimmenden Elemente zurück. Es werden keine Elementdaten zurückgegeben.

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

Analysiert eine POJO-Klasse, die eine DynamoDB-Tabelle repräsentiert und gibt eine `CreateTableRequest` für diese Tabelle zurück.

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

Erstellt einen Link zu einem Objekt in Amazon S3. Sie müssen einen Bucket-Namen und einen Schlüsselnamen angeben, welches das Objekt in dem Bucket eindeutig identifiziert.

Um `createS3Link` zu verwenden, muss die Mapper-Klasse die Methoden "Getter" und "Setter" definieren. Das folgende Codebeispiel veranschaulicht dies, indem der `CatalogItem` Klasse ein neues Attribut und neue getter/setter Methoden hinzugefügt werden.

```
@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;
    }

...
}
```

Der folgende Java-Code definiert ein neues Element, das in die Tabelle `Product` geschrieben werden soll. Das Element enthält einen Link zu einemr Produktimage. Die Imagedaten werden auf Amazon S3 hochgeladen.

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

Die `S3Link`-Klasse bietet viele andere Methoden für die Bearbeitung von Objekten in Amazon S3. Weitere Informationen finden Sie unter [Javadocs for `S3Link`](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/S3Link.html).

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

Gibt den zugrunde liegenden `S3ClientCache` für den Zugriff auf Amazon S3 zurück. Ein `S3ClientCache` ist ein intelligentes Mapping für `AmazonS3Client`-Objekte. Wenn Sie mehrere Kunden haben, `S3ClientCache` kann Ihnen an dabei helfen, die Kunden nach AWS Regionen zu organisieren und bei Bedarf neue Amazon S3 S3-Clients zu erstellen.

# Unterstützte Datentypen für Dynamo DBMapper für Java
<a name="DynamoDBMapper.DataTypes"></a>

Dieser Abschnitt beschreibt die unterstützten primitiven Java-Datentypen, Sammlungen und beliebige Datentypen in Amazon DynamoDB. 

Amazon DynamoDB unterstützt folgenden primitiven Java-Datentypen und primitiven Wrapperklassen. 
+ `String`
+ `Boolean`, `boolean`
+ `Byte`, `byte`
+ `Date` (als [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601) Millisekunden-Präzisionszeichenfolge, verschoben nach UTC)
+ `Calendar` (als [ISO\$18601](http://en.wikipedia.org/wiki/ISO_8601) Millisekunden-Präzisionszeichenfolge, verschoben nach UTC)
+ `Long`, `long`
+ `Integer`, `int`
+ `Double`, `double`
+ `Float`, `float`
+ `BigDecimal`
+ `BigInteger`

**Anmerkung**  
Weitere Informationen zu DynamoDB-Benennungsregeln und den verschiedenen unterstützten Datentypen finden sie unter [Unterstützte Datentypen und Benennungsregeln in Amazon DynamoDB](HowItWorks.NamingRulesDataTypes.md). 
Leere Binärwerte werden von Dynamo DBMapper unterstützt.
Leere Zeichenfolgenwerte werden unterstützt von AWS SDK for Java 2.x.  
In AWS SDK for Java 1.x DBMapper unterstützt Dynamo das Lesen leerer String-Attributwerte, schreibt jedoch keine leeren String-Attributwerte, da diese Attribute aus der Anforderung gelöscht werden.

DynamoDB unterstützt die Java-Sammlungstypen [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) und [Map](http://docs.oracle.com/javase/6/docs/api/java/util/Map.html). Die folgende Tabelle fasst zusammen, wie diese Java-Typen den DynamoDB-Typen zugewiesen werden.


****  

| Java-Typ | DynamoDB-Typ | 
| --- | --- | 
|  Alle Zahlentypen  |  `N` (Zahlentyp)  | 
|  Zeichenfolgen  |  `S` (Zeichenfolgetyp)   | 
|  Boolesch  |  `BOOL` (Boolescher Typ), 0 oder 1.  | 
|  ByteBuffer  |  `B` (Binärtyp)  | 
|  Date  |  `S` (Zeichenfolgetyp). Die Datumswerte werden als ISO-8601-formatierte Zeichenfolge gespeichert.  | 
| [Set](http://docs.oracle.com/javase/6/docs/api/java/util/Set.html)-Sammlungstypen |  `SS` (Zeichenfolgesatz)-Typ, `NS` (Zahlensatz)-Typ oder `BS` (Binärsatz)-Typ.  | 

 Die `DynamoDBTypeConverter`-Schnittstelle ermöglicht das Mapping eigener beliebiger Datentypen zu einem Datentyp, der von DynamoDB nativ unterstützt wird. Weitere Informationen finden Sie unter [Zuordnen willkürlicher Daten in DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md). 

# Java-Anmerkungen für DynamoDB
<a name="DynamoDBMapper.Annotations"></a>

Dieser Abschnitt beschreibt die Anmerkungen, die für das Mapping Ihrer Klassen und Eigenschaften zu Tabellen und Attributen in Amazon DynamoDB verfügbar sind.

Die entsprechende Javadoc-Dokumentation finden Sie unter [Annotation Types Summary](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/package-summary.html) in der [AWS SDK für Java API-Referenz](https://docs.aws.amazon.com/sdk-for-java/latest/reference/).

**Anmerkung**  
In den folgenden Anmerkungen sind ausschließlich `DynamoDBTable` und der `DynamoDBHashKey` erforderlich. 

**Topics**
+ [Dynamo DBAttribute](#DynamoDBMapper.Annotations.DynamoDBAttribute)
+ [Dynamo DBAuto GeneratedKey](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey)
+ [Dynamo DBAuto GeneratedTimestamp](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp)
+ [Dynamo DBDocument](#DynamoDBMapper.Annotations.DynamoDBDocument)
+ [Dynamo-Schlüssel DBHash](#DynamoDBMapper.Annotations.DynamoDBHashKey)
+ [Dynamo DBIgnore](#DynamoDBMapper.Annotations.DynamoDBIgnore)
+ [Dynamo DBIndex HashKey](#DynamoDBMapper.Annotations.DynamoDBIndexHashKey)
+ [Dynamo DBIndex RangeKey](#DynamoDBMapper.Annotations.DynamoDBIndexRangeKey)
+ [Dynamo-Schlüssel DBRange](#DynamoDBMapper.Annotations.DynamoDBRangeKey)
+ [Dynamo DBTable](#DynamoDBMapper.Annotations.DynamoDBTable)
+ [Dynamo wurde konvertiert DBType](#DynamoDBMapper.Annotations.DynamoDBTypeConverted)
+ [Dynamo DBTyped](#DynamoDBMapper.Annotations.DynamoDBTyped)
+ [Dynamo-Attribut DBVersion](#DynamoDBMapper.Annotations.DynamoDBVersionAttribute)

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

Ordnet eine Eigenschaft einem Tabellenattribut zu. Standardmäßig wird jede Klasseneigenschaft einem Elementattribut mit demselben Namen zugeordnet. Wenn die Namen jedoch nicht identisch sind, können Sie diese Anmerkung verwenden, um dem Attribut eine Eigenschaft zuzuordnen. Im folgenden Java-Ausschnitt ordnet `DynamoDBAttribute` die `BookAuthors`-Eigenschaft dem `Authors`-Attributnamen in der Tabelle zu.

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

Der `DynamoDBMapper` verwendet `Authors` als Attributnamen bei der Speicherung des Objekts in die Tabelle. 

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

Kennzeichnet eine Partitions- oder Sortierschlüsseleigenschaft als automatisch generiert. `DynamoDBMapper` generiert beim Speichern dieser Attribute nach dem Zufallsprinzip eine [UUID](http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html). Ausschließlich Zeichenfolgeeigenschaften können als automatisch generierte Schlüssel markiert werden. 

Das folgende Beispiel zeigt die Verwendung von automatisch generierten Schlüsseln.

```
@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());
    }
}
```

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

Generiert automatisch einen Zeitstempel.

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

Optional kann die Strategie für die automatische Generierung durch Angabe eines Strategieattributs definiert werden. Der Standardwert ist `ALWAYS`.

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

Gibt an, dass eine Klasse als Amazon-DynamoDB-Dokument serialisiert werden kann.

Angenommen, Sie möchten ein JSON-Dokument einem DynamoDB-Attribut des Typs „Map“ zuweisen (`M`). Im folgenden Codebeispiel wird ein Element definiert, das ein verschachteltes Attribut (Bilder) des Typs „Map“ enthält.

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

     }
}
```

Anschließend könnten Sie ein neues `ProductCatalog`-Element mit `Pictures` speichern wie im folgenden Beispiel gezeigt.

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

Das resultierende `ProductCatalog`-Element würde wie folgt aussehen (im JSON-Format).

```
{
  "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"
  }
}
```

## Dynamo-Schlüssel DBHash
<a name="DynamoDBMapper.Annotations.DynamoDBHashKey"></a>

Ordnet eine Klasseneigenschaft dem Partitionsschlüssel der Tabelle zu. Die Eigenschaft muss ein skalarer Zeichenfolge-, Zahlen- oder Binärtyp sein. Die Eigenschaft darf kein Sammlungstyp sein. 

Angenommen, Sie besitzen eine Tabelle `ProductCatalog`, die `Id` als Primärschlüssel verwendet. Der folgende Java-Code definiert eine `CatalogItem`-Klasse und ordnet ihre Eigenschaft `Id` dem Primärschlüssel der Tabelle `ProductCatalog` mithilfe des Tags `@DynamoDBHashKey` zu.

```
@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.
}
```

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

Zeigt der `DynamoDBMapper`-Instance an, dass die zugeordnete Eigenschaft ignoriert werden sollte. Beim Speichern der Daten in die Tabelle, speichert der `DynamoDBMapper` diese Eigenschaft nicht in die Tabelle.

 Wird auf die Getter-Methode oder das Klassenfeld für eine nicht modellierte Eigenschaft angewendet. Wenn die Anmerkung direkt auf das Klassenfeld angewendet wird, müssen die entsprechenden Getter- und Setter-Methoden in derselben Klasse deklariert werden. 

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

Ordnet eine Klasseneigenschaft dem Partitionsschlüssel eines globalen sekundären Index zu. Die Eigenschaft muss ein skalarer Zeichenfolge-, Zahlen- oder Binärtyp sein. Die Eigenschaft darf kein Sammlungstyp sein. 

Verwenden Sie diese Anmerkung, wenn Sie `Query` einen globalen sekundären Index brauchen. Sie müssen den Indexnamen angeben (`globalSecondaryIndexName`). Wenn sich der Name der Klasseneigenschaft vom Indexpartitionsschlüssel unterscheidet, müssen Sie auch den Namen dieses Indexattributs (`attributeName`).

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

Ordnet eine Klasseneigenschaft dem Sortierschlüssel eines globalen sekundären Index oder eines lokalen sekundären Index zu. Die Eigenschaft muss ein skalarer Zeichenfolge-, Zahlen- oder Binärtyp sein. Die Eigenschaft darf kein Sammlungstyp sein. 

Verwenden Sie diese Anmerkung, wenn Sie `Query` für einen lokalen sekundären Index oder einen globalen sekundären Index ausführen müssen und die Ergebnisse mithilfe des Index-Sortierschlüssels verfeinern möchten. Sie müssen den Indexnamen angeben (entweder `globalSecondaryIndexName` oder `localSecondaryIndexName`). Wenn der Name der Klasseneigenschaft sich von dem Indexsortierschlüssel unterscheidet, müssen Sie auch den Namen dieses Indexattributs (`attributeName`).

## Dynamo-Schlüssel DBRange
<a name="DynamoDBMapper.Annotations.DynamoDBRangeKey"></a>

Ordnet eine Klasseneigenschaft dem Sortierschlüssel der Tabelle zu. Die Eigenschaft muss ein skalarer Zeichenfolge-, Zahlen- oder Binärtyp sein. Sie darf kein Sammlungstyp sein. 

Wenn der Primärschlüssel zusammengesetzt ist (Partitionsschlüssel und Sortierschlüssel), können Sie diesen Tag verwenden, um Ihr Klassenfeld dem Sortierschlüssel zuzuordnen. Angenommen, Sie verfügen über eine Tabelle `Reply`, die Antworten für Forum-Threads speichert. Jeder Thread kann zahlreiche Antworten enthalten. Daher ist der Primärschlüssel dieser Tabelle sowohl die `ThreadId` als auch `ReplyDateTime`. Die `ThreadId` ist der Partitionsschlüssel und `ReplyDateTime` ist der Sortierschlüssel. 

Der folgende Java-Code definiert die Klasse `Reply` und ordnet sie der Tabelle `Reply` zu. Es werden die `@DynamoDBHashKey` und `@DynamoDBRangeKey`-Tags für die Identifizierung der Klasseneigenschaften, die dem Primärschlüssel zugeordnet werden, verwendet.

```
@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.
}
```

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

Identifiziert die Zieltabelle in DynamoDB. Der folgende Java-Code definiert beispielsweise die Klasse `Developer` und ordnet sie der `People`-Tabelle in DynamoDB zu. 

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

Die `@DynamoDBTable`-Anmerkung kann geerbt werden. Jede neue Klasse, die von der Klasse `Developer` erbt, wird ebenfalls der Tabelle `People` zugeordnet. Angenommen, Sie erstellen beispielsweise eine `Lead` -Klasse, die von der `Developer`-Klasse erbt. Da Sie die Klasse `Developer` der Tabelle `People` zugeordnet haben, werden die Objekte der Klasse `Lead` ebenfalls in dieser Tabelle gespeichert.

Die `@DynamoDBTable` kann auch außer Kraft gesetzt werden. Jede neue Klasse, die standardmäßig von der Klasse `Developer` erbt, wird dieser Tabelle `People` zugeordnet. Sie können jedoch dieses Standardmapping außer Kraft setzen. Wenn Sie beispielsweise eine Klasse erstellen, die von der Klasse `Developer` erbt, können Sie sie ausdrücklich einer anderen Tabelle zuweisen, indem Sie die Anmerkung `@DynamoDBTable` hinzufügen wie im folgenden Java-Codebeispiel gezeigt.

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

## Dynamo wurde konvertiert DBType
<a name="DynamoDBMapper.Annotations.DynamoDBTypeConverted"></a>

Eine Anmerkung, die angibt, dass eine Eigenschaft einen benutzerdefinierten Typkonverter verwendet. Kann in einer benutzerdefinierten Anmerkung mit Anmerkungen versehen werden, um dem `DynamoDBTypeConverter` zusätzliche Eigenschaften zu übergeben. 

 Die `DynamoDBTypeConverter`-Schnittstelle ermöglicht das Mapping eigener beliebiger Datentypen zu einem Datentyp, der von DynamoDB nativ unterstützt wird. Weitere Informationen finden Sie unter [Zuordnen willkürlicher Daten in DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md).

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

Eine Anmerkung, mit der die standardmäßige Attributtypbindung überschrieben wird. Standard-Typen erfordern die Anmerkung nicht, wenn Sie die Standard-Attributbindung für diesen Typ anwenden. 

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

Identifiziert eine Klasseneigenschaft für das Speichern einer Versionsnummer der optimistischen Sperre. `DynamoDBMapper` weist dieser Eigenschaft eine Versionsnummer zu, wenn ein neues Element gespeichert wird, und erhöht sie bei jeder Aktualisierung des Elements. Ausschließlich Zahlentypen und skalare Typen werden unterstützt. Weitere Informationen zu Datentypen finden Sie unter [Datentypen](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes). Weitere Informationen über das Versioning finden Sie unter [DynamoDB und optimistische Sperren mit Versionsnummer](DynamoDBMapper.OptimisticLocking.md).

# Optionale Konfigurationseinstellungen für Dynamo DBMapper
<a name="DynamoDBMapper.OptionalConfig"></a>

Wenn Sie eine Instance von `DynamoDBMapper` erstellen, verfügt sie über bestimmte Standardverhaltensweisen. Sie können diese Standards überschreiben, indem Sie die `DynamoDBMapperConfig`-Klasse verwenden. 

Der folgende Codeausschnitt erstellt einen `DynamoDBMapper` mit benutzerdefinierten Einstellungen:

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

Weitere Informationen finden Sie unter [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) in der [AWS SDK für Java API-Referenz.](https://docs.aws.amazon.com/sdk-for-java/latest/reference/)

Sie können folgende Argumente für die Instance von `DynamoDBMapperConfig` verwenden:
+ Einen `DynamoDBMapperConfig.ConsistentReads`-Aufzählungswert:
  + `EVENTUAL` – die Mapper-Instance verwendet eine Eventually Consistent-Anforderung.
  + `CONSISTENT` – die Mapper-Instance verwendet eine Strongly-Consistent-Leseanforderung. Sie können diese optionale Einstellung mit der `load`-, `query`- oder `scan`-Operation verwenden. Strongly-Consistent-Lesevorgänge haben Auswirkungen auf Leistung und Fakturierung. Weitere Informationen finden Sie auf der DynamoDB-[Produktdetailseite](https://aws.amazon.com/dynamodb).

  Wenn Sie keine Lesekonsistenzeinstellung für die Mapper-Instance festgelegt haben, ist der Standard `EVENTUAL`.
**Anmerkung**  
Dieser Wert wird bei den `batch load` Operationen`query`, `querypage``load`, und von Dynamo DBMapper angewendet.
+ Ein `DynamoDBMapperConfig.PaginationLoadingStrategy`-Aufzählungswert – kontrolliert wie die Mapper-Instance eine paginierte Datenliste, z. B. ein `query`- oder `scan`-Ergebnis, verarbeitet:
  + `LAZY_LOADING` – Die Mapper-Instance lädt wenn möglich Daten und belässt alle geladenen Ergebnisse im Speicher.
  + `EAGER_LOADING` – die Mapper-Instance lädt die Daten, sobald die Liste initialisiert wird.
  + `ITERATION_ONLY` – Sie können nur einen Iterator nutzen, um aus der Liste zu lesen. Während der Iteration wird die Liste alle vorherigen Ergebnisse löschen, bevor die nächste Seite geladen wird, sodass die Liste höchstens eine Seite der geladenen Ergebnisse im Speicher hält. Dies bedeutet auch, dass die Liste nur einmal iteriert werden kann. Diese Strategie wird bei der Bearbeitung von großen Elementen empfohlen, um den Speichermehraufwand zu reduzieren.

  Wenn Sie keine Paginierungsladestrategie für die Mapper-Instance angeben, ist der Standard `LAZY_LOADING`.
+ Ein `DynamoDBMapperConfig.SaveBehavior`-Aufzählungswert – gibt an wie die Mapper-Instance während Speichervorgängen mit den Attributen umgehen sollte:
  + `UPDATE` – während eines Speichervorgangs werden alle modellierten Attribute aktualisiert, nicht modellierte Attribute bleiben davon unberührt. Primitive Zahlentypen (Byte, int, long) werden auf 0 gesetzt. Objekttypen werden auf Null gesetzt. 
  + `CLOBBER` – löscht und ersetzt alle Attribute während eines Speichervorgangs, nicht modellierte Attribute eingeschlossen. Dies erfolgt durch das Löschen des Elements und seiner Neuerstellung. Versionierte Feldeinschränkungen werden ebenfalls ignoriert.

   Wenn Sie die Speicherverhaltensweise der Mapper-Instance nicht festlegen, ist der Standard `UPDATE`.
**Anmerkung**  
DBMapper Dynamo-Transaktionsoperationen unterstützen keine Aufzählung. `DynamoDBMapperConfig.SaveBehavior` 
+ Ein `DynamoDBMapperConfig.TableNameOverride`-Objekt – weist die Mapper-Instance an, den Tabellennamen, der durch die `DynamoDBTable`-Anmerkung einer Klasse festgelegt wurde, zu ignorieren und stattdessen einen anderen Tabellennamen zu verwenden, den Sie festlegen. Dies ist beim Partitionieren der Daten in mehrere Tabellen zur Laufzeit nützlich. 

Sie können das Standardkonfigurationsobjekt für `DynamoDBMapper` pro Operation falls nötig überschreiben.

# DynamoDB und optimistische Sperren mit Versionsnummer
<a name="DynamoDBMapper.OptimisticLocking"></a>

*Optimistische Sperren* stellen eine Strategie dar, die sicherstellt, dass das clientseitige Element, das Sie aktualisieren (oder löschen), das gleiche Element wie in Amazon DynamoDB ist. Wenn Sie diese Strategie verwenden, werden Ihre Datenbankschreibvorgänge vor dem Überschreiben durch Schreibvorgänge anderer Benutzer geschützt und umgekehrt.

Mit der optimistischen Sperre verfügt jedes Element über ein Attribut, das als Versionsnummer fungiert. Wenn Sie ein Element in einer Tabelle abrufen, zeichnet die Anwendung die Versionsnummer dieses Elements auf. Sie können das Element aktualisieren, jedoch nur, wenn die serverseitige Versionsnummer nicht geändert wurde. Wenn Versionen nicht übereinstimmen, bedeutet das, dass ein anderer Benutzer das Element vor Ihnen geändert hat. Die Aktualisierung schlägt fehlt, da Sie eine veraltete Version des Elements besitzen. Wenn dies der Fall ist, wiederholen Sie den Vorgang, indem Sie das Element abrufen und anschließend versuchen, es zu aktualisieren. Die optimistische Sperre hindert Sie daran, versehentlich Änderungen anderer Benutzer zu überschreiben. Sie hindert auch andere Benutzer daran, versehentlich Ihre Änderungen zu überschreiben.

Sie können zwar Ihre eigene optimistische Sperrstrategie implementieren, stellt jedoch die AWS SDK für Java Anmerkung bereit. `@DynamoDBVersionAttribute` In der Mappingklasse für Ihre Tabelle legen Sie eine Eigenschaft zum Speichern der Versionsnummer fest und kennzeichnen diese mithilfe dieser Anmerkung. Wenn Sie ein Objekt speichern, wird das entsprechende Element in der DynamoDB-Tabelle über ein Attribut verfügen, das die Versionsnummer speichert. Der `DynamoDBMapper` weist eine Versionsnummer zu, wenn Sie das Element zum ersten Mal speichern und er erhöht automatisch die Versionsnummer bei jeder Aktualisierung des Elements. Die Aktualisierungs- oder Löschanforderungen sind nur erfolgreich, wenn die clientseitige Objektversion der entsprechenden Versionsnummer des Elements in der DynamoDB-Tabelle entspricht.

 `ConditionalCheckFailedException` wird aufgeworfen, wenn: 
+  Sie eine optimistische Sperre mit `@DynamoDBVersionAttribute` verwenden und sich der Versionswert auf dem Server von dem Wert auf der Client-Seite unterscheidet. 
+  Sie Ihre eigenen bedingten Einschränkungen beim Speichern der Daten angeben, indem Sie `DynamoDBMapper` mit `DynamoDBSaveExpression` verwenden, und diese Einschränkungen fehlgeschlagen sind. 

**Anmerkung**  
Globale Tabellen in DynamoDB verwenden bei gleichzeitigen Updates einen Mechanismus, bei dem der letzte Schreibvorgang gültig ist. Bei Verwendung von globalen Tabellen ist immer der letzte Schreibvorgang gültig. In diesem Fall funktioniert das Sperren daher nicht wie erwartet.
Transaktionale Schreibvorgänge von `DynamoDBMapper` unterstützen keine `@DynamoDBVersionAttribute`-Anmerkung und -Bedingungsausdrücke auf demselben Objekt. Wenn ein Objekt innerhalb eines transaktionalen Schreibvorgangs mit einer Anmerkung versehen ist `@DynamoDBVersionAttribute` und auch über einen Bedingungsausdruck verfügt, SdkClientException wird ein ausgelöst.

Der folgende Java-Code definiert beispielsweise die Klasse `CatalogItem`, die über mehrere Eigenschaften verfügt. Die `Version`-Eigenschaft wird mit der `@DynamoDBVersionAttribute`-Anmerkung gekennzeichnet.

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

Sie können die `@DynamoDBVersionAttribute`-Anmerkung auf löschbare Typen anwenden, die durch primitive Wrapper-Klassen bereitgestellt wurden, die wiederum einen löschbaren Typ wie `Long` und `Integer` bereitstellen. 

Die optimistische Sperre hat folgende Auswirkungen auf diese `DynamoDBMapper`-Methoden:
+ `save` – für ein neues Element weist der `DynamoDBMapper` eine erste Versionsnummer 1 zu. Wenn Sie ein Element abrufen, eine oder mehrere seiner Eigenschaften aktualisieren und versuchen, die Änderungen zu speichern, ist die Speicheroperation nur dann erfolgreich, wenn die clientseitige und die serverseitige Versionsnummer übereinstimmen. Der `DynamoDBMapper` erhöht die Versionsnummer automatisch.
+ `delete` – die `delete`-Methode übernimmt ein Objekt als einen Parameter und der `DynamoDBMapper` führt einen Versionscheck durch, bevor er das Element löscht. Der Versionscheck kann deaktiviert werden, wenn `DynamoDBMapperConfig.SaveBehavior.CLOBBER` in der Anforderung angegeben wird.

  Die interne Implementierung der optimistischen Sperre im `DynamoDBMapper` nutzt die von DynamoDB bereitgestellte Unterstützung für bedingtes Aktualisieren und bedingtes Löschen. 
+ `transactionWrite` —
  + `Put` – für ein neues Element weist der `DynamoDBMapper` eine erste Versionsnummer 1 zu. Wenn Sie ein Element abrufen, eine oder mehrere seiner Eigenschaften aktualisieren und versuchen, die Änderungen zu speichern, ist die Put-Operation nur dann erfolgreich, wenn die clientseitige und die serverseitige Versionsnummer übereinstimmen. Der `DynamoDBMapper` erhöht die Versionsnummer automatisch.
  + `Update` – für ein neues Element weist der `DynamoDBMapper` eine erste Versionsnummer 1 zu. Wenn Sie ein Element abrufen, eine oder mehrere seiner Eigenschaften aktualisieren und versuchen, die Änderungen zu speichern, ist die Update-Operation nur dann erfolgreich, wenn die clientseitige und die serverseitige Versionsnummer übereinstimmen. Der `DynamoDBMapper` erhöht die Versionsnummer automatisch.
  + `Delete` – `DynamoDBMapper` führt eine Versionsprüfung durch, bevor er das Element löscht. Die Lösch-Operation ist nur dann erfolgreich, wenn die Versionsnummern auf Clientseite und auf Serverseite übereinstimmen.
  + `ConditionCheck` – die `@DynamoDBVersionAttribute`-Anmerkung wird für `ConditionCheck`-Operationen nicht unterstützt. Ein SdkClientException wird ausgelöst, wenn ein `ConditionCheck` Element mit einer Anmerkung versehen ist. `@DynamoDBVersionAttribute` 

## Deaktivieren der optimistischen Sperre
<a name="DynamoDBMapper.OptimisticLocking.Disabling"></a>

Um die optimistische Sperre zu deaktivieren, können Sie den `DynamoDBMapperConfig.SaveBehavior`-Aufzählungswert von `UPDATE` auf `CLOBBER` ändern. Sie können dies tun, indem Sie eine `DynamoDBMapperConfig`-Instance erstellen, die eine Versionsüberprüfung überspringt und diese Instance für alle Anforderungen verwendet. Weitere Informationen zu `DynamoDBMapperConfig.SaveBehavior` und anderen optionalen `DynamoDBMapper`-Parametern finden Sie unter [Optionale Konfigurationseinstellungen für Dynamo DBMapper](DynamoDBMapper.OptionalConfig.md). 

Sie können auch ein Sperrverhalten ausschließlich für eine bestimmte Operation festlegen. Der folgende Java-Ausschnitt verwendet beispielsweise den `DynamoDBMapper`, um ein Katalogelement zu speichern. Er legt ein `DynamoDBMapperConfig.SaveBehavior` fest, indem er optionale `DynamoDBMapperConfig`-Parameter der `save`-Methode hinzufügt. 

**Anmerkung**  
Die TransactionWrite-Methode unterstützt Dynamo DBMapper Config nicht. SaveBehaviorKonfiguration. Das Deaktivieren der optimistischen Sperre für transactionWrite wird nicht unterstützt.

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

# Zuordnen willkürlicher Daten in DynamoDB
<a name="DynamoDBMapper.ArbitraryDataMapping"></a>

Zusätzlich zu den unterstützten Java-Typen (siehe [Unterstützte Datentypen für Dynamo DBMapper für Java](DynamoDBMapper.DataTypes.md)) können Sie Typen in der Anwendungen verwenden, für die es keine direkte Mapping zu Amazon-DynamoDB-Typen gibt. Um diese Typen zuzuweisen, müssen Sie eine Implementierung bereitstellen, die Ihren komplexen Typ in einen von DynamoDB unterstützten Typ und umgekehrt konvertiert, und die komplexe Typzugriffsmethode unter Verwendung der Anmerkung `@DynamoDBTypeConverted` kommentieren. Der Konverter-Code wandelt Daten um, wenn Objekte gespeichert oder geladen werden. Er wird außerdem für alle Operationen verwendet, die komplexe Typen nutzen. Beachten Sie, dass beim Vergleichen von Daten während der Abfrage- und Scan-Operationen, die Vergleiche für die in DynamoDB gespeicherten Daten gemacht werden.

Betrachten Sie zum Beispiel die folgende `CatalogItem`-Klasse, die die Eigenschaft `Dimension` mit dem Typ `DimensionType` definiert. Diese Eigenschaft speichert die Elementabmessungen wie Höhe, Breite und Dicke. Gehen Sie davon aus, dass Sie sich dazu entscheiden, diese Elementmaße als Zeichenfolge (z. B. 8,5 x 11 x ,05) in DynamoDB zu speichern. Das folgende Beispiel stellt einen Konverter-Code bereit, der das `DimensionType`-Objekt in eine Zeichenfolge und eine Zeichenfolge in einen `DimensionType` konvertiert.



**Anmerkung**  
In diesem Codebeispiel wird davon ausgegangen, dass Sie bereits Daten für Ihr Konto in DynamoDB geladen haben, indem Sie die Anweisungen im Abschnitt [Erstellen von Tabellen und Laden von Daten für Codebeispiele in DynamoDB](SampleData.md) befolgen.  
 step-by-stepAnweisungen zur Ausführung des folgenden Beispiels finden Sie unter. [Java-Codebeispiele](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;
        }
    }
}
```

# Beispiele für DynamoDBMapper
<a name="DynamoDBMapper.Examples"></a>

Das AWS-SDK für Java stellt eine `DynamoDBMapper`-Klasse bereit, mit der Sie Ihre clientseitigen Klassen zu Amazon-DynamoDB-Tabellen zuweisen können. Um `DynamoDBMapper` zu verwenden, definieren Sie die Beziehung zwischen Elementen in einer DynamoDB-Tabelle und ihren entsprechenden Objekt-Instances im Code. Die `DynamoDBMapper`-Klasse ermöglicht Ihnen auch die Ausführung verschiedener Create-, Read-, Update-, und Delete-Operationen (CRUD) für Elemente sowie das Ausführen von Abfragen und Scans für Tabellen.

Weitere Informationen für die Verwendung von `DynamoDBMapper` finden Sie unter [DynamoDB-Beispiele für die Verwendung des AWS-SDK für Java](https://docs.aws.amazon.com/sdk-for-java/v1/developer-guide/examples-dynamodb.html) im *AWS-SDK für Java 1.x-Entwicklerhandbuch*. 

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

Der erweiterte DynamoDB-Client ist eine Bibliothek auf hoher Ebene, die Teil von AWS SDK für Java Version 2 (v2) ist. Er bietet eine einfache Möglichkeit, clientseitige Klassen zu DynamoDB-Tabellen zuzuordnen. Sie definieren die Beziehungen zwischen Tabellen und ihren jeweiligen Modellklassen im Code. Nach der Definition dieser Beziehungen können Sie verschiedene Operationen zum Erstellen, Lesen, Aktualisieren oder Löschen (Create, Read, Update, Delete, CRUD) für Tabellen oder Elemente in DynamoDB auf intuitive Weise ausführen.

Weitere Informationen darüber, wie Sie den erweiterten Client mit DynamoDB verwenden können, finden Sie unter [Verwenden des erweiterten DynamoDB-Clients im AWS SDK für Java 2.x](https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/dynamodb-enhanced-client.html). 

# Arbeiten dem .NET-Dokumentmodell in DynamoDB
<a name="DotNetSDKMidLevel"></a>

Das AWS SDK für .NET bietet Dokumentmodellklassen, die einige der Low-Level-Amazon-DynamoDB-Operationen zur weiteren Vereinfachung der Codierung umschließen. Die primären Klassen im Dokumentmodell sind `Table` und `Document`. Die `Table`-Klasse bietet Datenoperationsmethoden wie `PutItem`, `GetItem` und `DeleteItem`. Außerdem stellt sie auch die `Query`- und die `Scan`-Methode bereit. Die `Document`-Klasse steht für ein einzelnes Element in einer Tabelle.

Die zuvor genannten Dokumentmodellklassen sind in dem `Amazon.DynamoDBv2.DocumentModel`-Namespace verfügbar.

**Anmerkung**  
Sie können die Dokumentmodellklassen nicht zum Erstellen, Aktualisieren und Löschen von Tabellen nutzen. Das Dokumentmodell unterstützt jedoch die meisten allgemeinen Datenoperationen.

**Topics**
+ [Unterstützte Datentypen](#MidLevelAPILimitations.SupportedTypes)

## Unterstützte Datentypen
<a name="MidLevelAPILimitations.SupportedTypes"></a>

Das Dokumentmodell unterstützt eine Reihe von primitiven .NET-Datentypen und Sammlungsdatentypen. Das Modell unterstützt die folgenden primitiven Datentypen. 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Guid`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

In der folgenden Tabelle ist das Mapping der vorhergehenden .NET-Typen zu den DynamoDB-Typen zusammengefasst.


****  

| .NET-primitiver Typ | DynamoDB-Typ | 
| --- | --- | 
|  Alle Zahlentypen  |  `N` (Zahlentyp)  | 
|  Alle Zeichenfolgetypen  |  `S` (Zeichenfolgetyp)   | 
|  MemoryStream, Byte []  |  `B` (Binärtyp)   | 
| bool | N (Zahlentyp) 0 repräsentiert False und 1 steht für True. | 
| DateTime | S (Zeichenfolgetyp). Die DateTime-Werte werden als ISO-8601-formatierte Zeichenfolgen gespeichert. | 
| Guid | S (Zeichenfolgetyp). | 
| Sammlungstypen (Liste, HashSet und Array) | BS-(Binärsatz)-Typ, SS-(Zeichenfolgesatz)-Typ und NS-(Zahlensatz)-Typ. | 

AWS SDK für .NET definiert Typen für das Mapping der booleschen, Null-, Listen- und Map-Typen von DynamoDB zur .NET-Dokumentmodell-API:
+ Verwenden Sie als booleschen Typ `DynamoDBBool`.
+ Verwenden Sie als den Null-Typ `DynamoDBNull`.
+ Verwenden Sie als Listentyp `DynamoDBList`.
+ Verwenden Sie als Map-Typ `Document`.

**Anmerkung**  
Leere Binärwerte werden unterstützt.
Das Lesen von leeren Zeichenfolgenwerten wird unterstützt. Leere Zeichenfolgen-Attributwerte werden beim Schreiben zu DynamoDB in Attributwerten vom Typ Zeichenfolgensatz unterstützt. Leere Zeichenfolgen-Attributwerte des Zeichenfolgentyps und leere Zeichenfolgenwerte innerhalb des Listen- oder Map-Typs werden aus Schreibanforderungen gelöscht.

# Arbeiten mit dem Object Persistence-Modell von .NET und DynamoDB
<a name="DotNetSDKHighLevel"></a>

Das AWS SDK für .NET bietet ein Objektpersistenzmodell, mit dem Sie Ihre clientseitigen Klassen Amazon DynamoDB-Tabellen zuordnen können. Die einzelnen Objekt-Instances werden anschließend einem Element in den entsprechenden Tabellen zugeordnet. Zum Speichern der clientseitigen Objekte in den Tabellen stellt das Object-Persistence-Modell die Klasse `DynamoDBContext` bereit, einen Eintrittspunkt für DynamoDB. Mit dieser Klasse verfügen Sie über eine Verbindung zu DynamoDB, können auf Tabellen zugreifen und verschiedene CRUD-Operationen sowie Abfragen ausführen.

Das Objektpersistenzmodell bietet eine Reihe von Attributen, um clientseitige Klassen Tabellen und Tabellenattributen zuzuordnen. properties/fields 

**Anmerkung**  
Das Object Persistence-Modell stellt keine API zum Erstellen, Aktualisieren oder Löschen von Tabellen bereit. Es stellt ausschließlich Datenoperationen bereit. Sie können nur die AWS SDK für .NET Low-Level-API verwenden, um Tabellen zu erstellen, zu aktualisieren und zu löschen.

Das folgende Beispiel zeigt, wie das Object Persistence-Modell funktioniert. Es wird mit der Tabelle `ProductCatalog` gestartet. Es besitzt `Id` als Primärschlüssel.

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

Angenommen, Sie besitzen die Klasse `Book` mit den Eigenschaften `Title`, `ISBN` und `Authors`. Sie können die Klasse `Book` der Tabelle `ProductCatalog` zuordnen, indem Sie die durch das Object Persistence-Modell definierten Attribute hinzufügen wie im folgenden C\$1-Codeausschnitt gezeigt.

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

Im vorherigen Beispiel ordnet das Attribut `DynamoDBTable` die Klasse `Book` der Tabelle `ProductCatalog` zu.

Das Object Persistence-Modell unterstützt die explizite und das Standardmapping zwischen Klasseneigenschaften und Tabellenattributen.
+ **Explizites Mapping – **Um eine Eigenschaft einem Primärschlüssel zuzuordnen, müssen Sie die `DynamoDBHashKey`- und `DynamoDBRangeKey`-Attribute des „Object-Persistence“-Modells verwenden. Außerdem gilt für andere als Primärschlüsselattribute, dass Sie das Mapping durch explizites Hinzufügen des Attributs `DynamoDBProperty` definieren müssen, wenn der Name einer Eigenschaft in Ihrer Klasse und des Tabellenattributs, dem Sie diese zuordnen möchten, nicht identisch sind.

  Im vorherigen Beispiel werden die Eigenschaft `Id` dem Primärschlüssel mit dem gleichen Namen und die Eigenschaft `BookAuthors` dem Attribut `Authors` in der Tabelle `ProductCatalog` zugeordnet.
+ **Standard-Mapping – **Standardmäßig ordnet das „Object Persistence“-Modell die Klasseneigenschaften den Attributen mit identischem Namen in der Tabelle zu.

  Im vorherigen Beispiel werden die Eigenschaften `Title` und `ISBN` den Attributen mit den gleichen Namen in der Tabelle `ProductCatalog` zugeordnet.

Sie müssen nicht jede einzelne Klasseneigenschaft zuordnen. Sie erkennen diese Eigenschaften, indem Sie das `DynamoDBIgnore`-Attribut hinzufügen. Wenn Sie eine `Book`-Instance in die Tabelle hochladen, enthält der `DynamoDBContext` nicht die `CoverPage`-Eigenschaft. Diese Eigenschaft wird auch nicht zurückgegeben, wenn Sie die Book-Instance abrufen.

Sie können Eigenschaften von primitiven .NET-Typen wie „int“ und „string“ zuweisen. Sie können auch beliebige Datentypen zuordnen, solange Sie einen geeigneten Konverter bereitstellen, um diese Datentypen einem DynamoDB-Datentyp zuzuordnen. Weitere Informationen zum Mapping beliebiger Datentypen finden Sie unter [Zuordnen beliebiger Daten mit DynamoDB mithilfe des AWS SDK für .NET Objektpersistenzmodells](DynamoDBContext.ArbitraryDataMapping.md).

Das Object Persistence-Modell unterstützt die optimistische Sperre. Während einer Aktualisierung stellt diese Funktion sicher, dass Sie über die neueste Kopie des zu aktualisierenden Elements verfügen. Weitere Informationen finden Sie unter [Optimistisches Sperren mit DynamoDB und dem AWS SDK für .NET Objektpersistenzmodell](DynamoDBContext.VersionSupport.md).

Weitere Informationen finden Sie in den folgenden Themen.

**Topics**
+ [Unterstützte Datentypen](#DotNetDynamoDBContext.SupportedTypes)
+ [DynamoDB-Attribute aus dem Object Persistence-Modell von .NET](DeclarativeTagsList.md)
+ [DBContext Dynamo-Klasse aus dem .NET-Objektpersistenzmodell](DotNetDynamoDBContext.md)
+ [Optimistisches Sperren mit DynamoDB und dem AWS SDK für .NET Objektpersistenzmodell](DynamoDBContext.VersionSupport.md)
+ [Zuordnen beliebiger Daten mit DynamoDB mithilfe des AWS SDK für .NET Objektpersistenzmodells](DynamoDBContext.ArbitraryDataMapping.md)

## Unterstützte Datentypen
<a name="DotNetDynamoDBContext.SupportedTypes"></a>

Das Object Persistence-Modell unterstützt eine Reihe primitiver .NET-Datentypen, Sammlungen sowie beliebiger Datentypen. Das Modell unterstützt die folgenden primitiven Datentypen. 
+ `bool`
+ `byte` 
+ `char`
+ `DateTime`
+ `decimal`
+ `double`
+ `float`
+ `Int16`
+ `Int32`
+ `Int64`
+ `SByte`
+ `string`
+ `UInt16`
+ `UInt32`
+ `UInt64`

Das Objektpersistenzmodell unterstützt auch die .NET-Sammlungstypen. `DynamoDBContext`ist in der Lage, konkrete Sammlungstypen und einfache Plain Old CLR-Objekte () POCOs zu konvertieren.

In der folgenden Tabelle ist das Mapping der vorhergehenden .NET-Typen zu den DynamoDB-Typen zusammengefasst.


****  

| .NET-primitiver Typ | DynamoDB-Typ | 
| --- | --- | 
|  Alle Zahlentypen  |  `N` (Zahlentyp)  | 
|  Alle Zeichenfolgetypen  |  `S` (Zeichenfolgetyp)   | 
|  MemoryStream, Byte []  |  `B` (Binärtyp)   | 
| bool | N (Zahlentyp) 0 repräsentiert False und 1 steht für True. | 
| Sammlungstypen | BS-(Binärsatz)-Typ, SS-(Zeichenfolgesatz)-Typ und NS-(Zahlensatz)-Typ. | 
| DateTime | S (Zeichenfolgetyp). Die DateTime-Werte werden als ISO-8601-formatierte Zeichenfolgen gespeichert. | 

Das Object Persistence-Modell unterstützt außerdem beliebige Datentypen. Allerdings müssen Sie einen Konverter-Code bereitstellen, um die komplexen Typen den DynamoDB-Typen zuzuordnen.

**Anmerkung**  
Leere Binärwerte werden unterstützt.
Das Lesen von leeren Zeichenfolgenwerten wird unterstützt. Leere Zeichenfolgen-Attributwerte werden beim Schreiben zu DynamoDB in Attributwerten vom Typ Zeichenfolgensatz unterstützt. Leere Zeichenfolgen-Attributwerte des Zeichenfolgentyps und leere Zeichenfolgenwerte innerhalb des Listen- oder Map-Typs werden aus Schreibanforderungen gelöscht.

# DynamoDB-Attribute aus dem Object Persistence-Modell von .NET
<a name="DeclarativeTagsList"></a>

Dieser Abschnitt beschreibt die Attribute, die das Object-Persistence-Modell bereitstellt, damit Sie Ihre Klassen und Eigenschaften den DynamoDB-Tabellen und -Attributen zuordnen können.

**Anmerkung**  
In den folgenden Attributen werden ausschließlich `DynamoDBTable` und `DynamoDBHashKey` benötigt.

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

Ordnet eine Klasseneigenschaft dem Partitionsschlüssel eines globalen sekundären Indexes zu. Verwenden Sie dieses Attribut, wenn Sie einen globalen sekundären Index `Query` möchten.

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

Ordnet eine Klasseneigenschaft dem Sortierungsschlüssel eines globalen sekundären Indexes zu. Verwenden Sie dieses Attribut, wenn Sie eine `Query` für einen globalen sekundären Schlüssel ausführen müssen und die Ergebnisse mithilfe des Indexsortierschlüssels verfeinern möchten.

## Dynamo-Schlüssel DBHash
<a name="w2aac17b9c21c23c37c11"></a>

Ordnet eine Klasseneigenschaft dem Partitionsschlüssel des Primärschlüssels der Tabelle zu. Die Primärschlüsselattribute können nicht ein Sammlungstyp sein.

Im folgenden C\$1-Codebeispiel werden die Klasse `Book` der Tabelle `ProductCatalog` und die Eigenschaft `Id` dem Partitionsschlüssel des Primärschlüssels der Tabelle zugeordnet.

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

    // Additional properties go here.
}
```

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

Zeigt an, dass die zugeordnete Eigenschaft ignoriert werden sollte. Wenn Sie keine Klasseneigenschaften speichern möchten, können Sie dieses Attribut hinzufügen, um `DynamoDBContext` anzuweisen, diese Eigenschaft beim Speichern von Objekten zur Tabelle nicht einzufügen.

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

Ordnet eine Klasseneigenschaft dem Sortierungsschlüssel eines lokalen sekundären Indexes zu. Verwenden Sie dieses Attribut, wenn Sie eine `Query` für einen lokalen sekundären Index ausführen müssen und die Ergebnisse mithilfe des Indexsortierschlüssels verfeinern möchten.

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

Ordnet eine Klasseneigenschaft einem Tabellenattribut zu. Wenn die Klasseneigenschaft einem Tabellenattribut mit dem gleichen Namen zugeordnet ist, müssen Sie dieses Attribut nicht angeben. Wenn die Namen jedoch nicht identisch sind, können Sie diesen Tag verwenden, um das Mapping bereitzustellen. In der folgenden C\$1-Anweisung ordnet `DynamoDBProperty` die Eigenschaft `BookAuthors` dem Attribut `Authors` in der Tabelle zu. 

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

`DynamoDBContext` verwendet diese Mappinginformationen, um beim Speichern von Objektdaten zur entsprechenden Tabelle das Attribut `Authors` zu erstellen.

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

Gibt einen alternativen Namen für eine Klasseneigenschaft an. Dies eignet sich für das Schreiben eines benutzerdefinierten Konverters, um beliebige Daten einer DynamoDB-Tabelle, in der sich der Name der Klasseneigenschaft von dem des Tabellenattributs unterscheidet, zuzuordnen.

## Dynamo-Schlüssel DBRange
<a name="w2aac17b9c21c23c37c21"></a>

Ordnet eine Klasseneigenschaft dem Sortierschlüssel des Primärschlüssels der Tabelle zu. Wenn die Tabelle über einen zusammengesetzten Primärschlüssel (Partitionsschlüssel und Sortierschlüssel) verfügt, müssen Sie sowohl das Attribut `DynamoDBHashKey` als auch das Attribut `DynamoDBRangeKey` im Klassenmapping angeben.

Die Beispieltabelle `Reply` verfügt über einen Primärschlüssel, der aus dem Partitionsschlüssel `Id` und dem Sortierschlüssel `Replenishment` besteht. Im folgenden C\$1-Codebeispiel wird die Klasse `Reply` der Tabelle `Reply` zugeordnet. Die Klassendefinition gibt ebenfalls an, dass zwei ihrer Eigenschaften den Primärschlüsseln zugeordnet werden.

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

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

Identifiziert die Zieltabelle in DynamoDB, zu der die Klasse zugeordnet wird. Im folgenden C\$1-Codebeispiel wird beispielsweise die Klasse `Developer` der Tabelle `People` in DynamoDB zugeordnet.

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

Dieses Attribut kann geerbt oder überschrieben werden.
+ Das `DynamoDBTable`-Attribut kann geerbt werden. Wenn Sie im vorherigen Beispiel die neue Klasse `Lead` hinzufügen, die von der Klasse `Developer` erbt, wird diese ebenfalls der Tabelle `People` zugeordnet. Sowohl das Objekt `Developer` als auch das Objekt `Lead` werden in der Tabelle `People` gespeichert.
+ Das `DynamoDBTable`-Attribut kann auch überschrieben werden. Im folgenden C\$1-Codebeispiel erbt die Klasse `Manager` von der Klasse `Developer`. Durch das explizite Hinzufügen des Attributs `DynamoDBTable` wird die Klasse jedoch einer anderen Tabelle (`Managers`) zugeordnet.

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

 Sie können den optionalen Parameter `LowerCamelCaseProperties` hinzufügen, um DynamoDB aufzufordern, den ersten Buchstaben des Eigenschaftsnamens beim Speichern von Objekten in einer Tabelle klein zu schreiben wie im folgenden C\$1-Codebeispiel gezeigt.

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

Beim Speichern von Instances der Klasse `Developer` speichert `DynamoDBContext` die Eigenschaft `DeveloperName` als `developerName`.

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

Identifiziert eine Klasseneigenschaft für das Speichern der Versionsnummer des Elements. Weitere Informationen über das Versioning finden Sie unter [Optimistisches Sperren mit DynamoDB und dem AWS SDK für .NET Objektpersistenzmodell](DynamoDBContext.VersionSupport.md).

# DBContext Dynamo-Klasse aus dem .NET-Objektpersistenzmodell
<a name="DotNetDynamoDBContext"></a>

Die `DynamoDBContext`-Klasse ist der Eintrittspunkt zu der Amazon-DynamoDB-Datenbank. Mit dieser Klasse verfügen Sie über eine Verbindung zu DynamoDB und können auf die Daten in unterschiedlichen Tabellen zugreifen, verschiedene CRUD-Operationen durchführen sowie Abfragen ausführen. Die Klasse `DynamoDBContext`-stellt folgende Methoden bereit.

**Topics**
+ [Erstellen MultiTable BatchGet](#w2aac17b9c21c23c39b7)
+ [Erschaffen MultiTable BatchWrite](#w2aac17b9c21c23c39b9)
+ [CreateBatchGet](#w2aac17b9c21c23c39c11)
+ [CreateBatchWrite](#w2aac17b9c21c23c39c13)
+ [Delete](#w2aac17b9c21c23c39c15)
+ [Dispose](#w2aac17b9c21c23c39c17)
+ [ExecuteBatchGet](#w2aac17b9c21c23c39c19)
+ [ExecuteBatchWrite](#w2aac17b9c21c23c39c21)
+ [FromDocument](#w2aac17b9c21c23c39c23)
+ [FromQuery](#w2aac17b9c21c23c39c25)
+ [FromScan](#w2aac17b9c21c23c39c27)
+ [GetTargetTable](#w2aac17b9c21c23c39c29)
+ [Load](#w2aac17b9c21c23c39c31)
+ [Query](#w2aac17b9c21c23c39c33)
+ [Save](#w2aac17b9c21c23c39c35)
+ [Scan](#w2aac17b9c21c23c39c37)
+ [ToDocument](#w2aac17b9c21c23c39c39)
+ [Optionale Parameter für Dynamo angeben DBContext](#OptionalConfigParams)

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

Erstellt ein `MultiTableBatchGet`-Objekt, das aus verschiedenen einzelnen `BatchGet`-Objekten besteht. Jedes dieser `BatchGet`-Objekte kann verwendet werden, um Elemente aus einer einzelnen DynamoDB-Tabelle abzurufen.

Um die Elemente aus Tabellen abzurufen, verwenden Sie die Methode `ExecuteBatchGet`, indem Sie das `MultiTableBatchGet`-Objekt als Parameter übergeben.

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

Erstellt ein `MultiTableBatchWrite`-Objekt, das aus verschiedenen einzelnen `BatchWrite`-Objekten besteht. Jedes dieser `BatchWrite`-Objekte kann für das Schreiben und das Löschen von Elementen in einer einzelnen DynamoDB-Tabelle verwendet werden.

Um zu Tabellen zu schreiben, verwenden Sie die Methode `ExecuteBatchWrite`, indem Sie das `MultiTableBatchWrite`-Objekt als Parameter übergeben.

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

Erstellt ein `BatchGet`-Objekt, welches für das Abrufen mehrerer Elemente aus einer Tabelle verwenden werden kann. 

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

Erstellt ein `BatchWrite`-Objekt, das Sie zum Ablegen mehrerer Elemente in einer Tabelle oder zum Löschen mehrerer Elemente aus einer Tabelle verwenden können. 

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

Löscht ein Element aus der Tabelle. Die Methode erfordert den Primärschlüssel des Elements, das Sie löschen möchten. Sie können entweder den Primärschlüsselwert oder ein clientseitiges Objekt bereitstellen, das einen Primärschlüsselwert als Parameter für diese Methode enthält.
+ Wenn Sie ein clientseitiges Objekt als Parameter angeben und die optimistische Sperre aktiviert haben, ist der Löschvorgang nur dann erfolgreich, wenn die clientseitigen und die serverseitigen Versionen des Objekts übereinstimmen.
+ Wenn Sie lediglich den Primärschlüsselwert als Parameter angeben, ist der Löschvorgang erfolgreich, unabhängig davon, ob die optimistische Sperre aktiv ist oder nicht.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `DeleteAsync`-Methode.

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

Entsorgt alle verwalteten und nicht verwalteten Ressourcen.

## ExecuteBatchGet
<a name="w2aac17b9c21c23c39c19"></a>

Liest Daten aus einer oder mehreren Tabellen und verarbeitet alle `BatchGet`-Objekte in einem `MultiTableBatchGet`.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `ExecuteBatchGetAsync`-Methode.

## ExecuteBatchWrite
<a name="w2aac17b9c21c23c39c21"></a>

Liest oder löscht Daten aus einer oder mehreren Tabellen und verarbeitet alle `BatchWrite`-Objekte in einem `MultiTableBatchWrite`.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `ExecuteBatchWriteAsync`-Methode.

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

Angesichts einer `Document`-Instance, gibt die `FromDocument`-Methode eine Instance der clientseitigen Klasse zurück.

Dies ist hilfreich, wenn Sie die Dokumentenmodell-Klassen zusammen mit dem Object Persistence-Modell verwenden möchten, um beliebige Datenoperationen durchzuführen. Weitere Hinweise zu den von der bereitgestellten Dokumentmodellklassen finden Sie unter[Arbeiten dem .NET-Dokumentmodell in DynamoDB](DotNetSDKMidLevel.md). AWS SDK für .NET

Angenommen, Sie besitzen ein `Document`-Objekt mit dem Namen `doc`, das eine Darstellung eines `Forum`-Elements enthält. (Informationen zum Konstruieren dieses Objekts finden Sie in der Beschreibung der Methode `ToDocument` weiter unten in diesem Thema.) Sie können `FromDocument` verwenden, um das `Forum`-Element aus dem `Document` abzurufen, wie im folgendem C\$1-Codebeispiel gezeigt.

**Example**  

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

**Anmerkung**  
Wenn das `Document`-Objekt die `IEnumerable`-Schnittstelle implementiert, können Sie stattdessen die `FromDocuments`-Methode nutzen. Auf diese Weise können Sie alle Klassen-Instances im `Document` durchlaufen.

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

Führt eine `Query`-Operation mit den Abfrageparametern aus, die in einem `QueryOperationConfig`-Objekt definiert sind.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `FromQueryAsync`-Methode.

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

Führt eine `Scan`-Operation mit den Scan-Parametern aus, die in einem `ScanOperationConfig`-Objekt definiert sind.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `FromScanAsync`-Methode.

## GetTargetTable
<a name="w2aac17b9c21c23c39c29"></a>

Ruft die Zieltabelle für den angegebenen Typ ab. Dies ist nützlich, wenn Sie einen benutzerdefinierten Konverter schreiben, der einer DynamoDB-Tabelle beliebige Daten zuordnet, und ermitteln müssen, welche Tabelle einem benutzerdefinierten Datentyp zugeordnet ist.

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

Ruft ein Element aus einer Tabelle ab. Die Methode erfordert lediglich den Primärschlüssel des Elements, das Sie abrufen möchten. 

Standardmäßig gibt DynamoDB das Element mit Werten die Eventually Consistent sind zurück. Weitere Informationen zum Eventual Consistency-Modell finden Sie unter [DynamoDB-Lesekonsistenz](HowItWorks.ReadConsistency.md).

`Load`oder `LoadAsync` Methode ruft den [GetItem](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_GetItem.html)Vorgang auf, bei dem Sie den Primärschlüssel für die Tabelle angeben müssen. Da der `IndexName`-Parameter von `GetItem` ignoriert wird, können Sie ein Element nicht mithilfe der Partition oder des Sortierschlüssels eines Indexes laden. Daher müssen Sie den Primärschlüssel der Tabelle verwenden, um ein Element zu laden.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `LoadAsync`-Methode. Ein Beispiel für die Verwendung der `LoadAsync`-Methode zur Ausführung von CRUD-Vorgängen auf hoher Ebene in einer DynamoDB-Tabelle finden Sie im Folgenden.

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

Abfragen einer Tabelle basierend auf den Abfrageparametern, die Sie bereitstellen.

Sie können eine Tabelle nur dann abfragen, wenn sie über einen zusammengesetzten Primärschlüssel verfügt (Partitionsschlüssel und Sortierschlüssel). Bei der Abfrage müssen Sie einen Partitionsschlüssel und eine Bedingung angeben, die für den Sortierschlüssel gilt.

Angenommen, Sie verfügen über die clientseitige Klasse `Reply`, die der Tabelle `Reply` in DynamoDB zugeordnet ist. Das folgende C\$1-Codebeispiel fragt die Tabelle `Reply` ab, um alle Forum-Thread-Antworten zu finden, die in den letzten 15 Tagen veröffentlicht wurden. Die Tabelle `Reply` verfügt über einen Primärschlüssel, der aus einem Partitionsschlüssel (`Id`) und Sortierschlüssel (`ReplyDateTime`) besteht.

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

Dies gibt eine Sammlung von `Reply`-Objekten zurück. 

Die Methode `Query` gibt standardmäßig eine „lazy-loaded“ `IEnumerable`-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie lediglich die `IEnumerable`-Sammlung durchlaufen.

Wenn die Tabelle über einen einfachen Primärschlüssel (Partitionsschlüssel) verfügt, können Sie die Methode `Query` nicht verwenden. Stattdessen können Sie die Methode `Load` verwenden und den Partitionsschlüssel bereitstellen, um das Element abzurufen.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `QueryAsync`-Methode.

## Save
<a name="w2aac17b9c21c23c39c35"></a>

Speichert das angegebene Objekt in der Tabelle. Wenn der im Eingabeobjekt angegebene Primärschlüssel in der Tabelle nicht vorhanden ist, fügt die Methode der Tabelle ein neues Element hinzu. Wenn der Primärschlüssel vorhanden ist, aktualisiert die Methode das vorhandene Element.

Wenn Sie eine optimistische Sperre konfiguriert haben, ist die Aktualisierung nur dann erfolgreich, wenn die client- und serverseitigen Versionen des Elements übereinstimmen. Weitere Informationen finden Sie unter [Optimistisches Sperren mit DynamoDB und dem AWS SDK für .NET Objektpersistenzmodell](DynamoDBContext.VersionSupport.md).

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `SaveAsync`-Methode.

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

Führt einen gesamten Tabellen-Scan durch. 

Sie können Scan-Ergebnisse filtern, indem Sie eine Scan-Bedingung angeben. Die Bedingung kann auf jedem Attribut in der Tabelle ausgewertet werden. Angenommen, Sie verfügen über die clientseitige Klasse `Book`, die der Tabelle `ProductCatalog` in DynamoDB zugeordnet ist. Im folgenden C\$1-Beispiel werden die Tabelle gescannt und ausschließlich die Book-Elemente zurückgegeben, deren Preis kleiner als 0 ist.

**Example**  

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

Die Methode `Scan` gibt standardmäßig eine „lazy-loaded“ `IEnumerable`-Sammlung zurück. Sie gibt anfänglich ausschließlich eine Ergebnisseite zurück und führt dann bei Bedarf einen Dienstaufruf für die nächste Seite durch. Um alle übereinstimmenden Elemente zu erhalten, müssen Sie lediglich die `IEnumerable`-Sammlung durchlaufen.

Aus Leistungsgründen sollten Sie Ihre Tabellen abfragen und einen Tabellen-Scan vermeiden.

**Anmerkung**  
Um diese Operation im Hintergrund auszuführen, nutzen Sie stattdessen die `ScanAsync`-Methode.

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

Gibt eine Instance der `Document`-Dokumentenmodell-Klasse aus Ihrer Klassen-Instance zurück. 

Dies ist hilfreich, wenn Sie die Dokumentenmodell-Klassen zusammen mit dem Object Persistence-Modell verwenden möchten, um beliebige Datenoperationen durchzuführen. Weitere Hinweise zu den von der bereitgestellten Dokumentmodellklassen finden Sie unter[Arbeiten dem .NET-Dokumentmodell in DynamoDB](DotNetSDKMidLevel.md). AWS SDK für .NET

Angenommen, Sie verfügen über eine clientseitige Klasse, die der Tabelle `Forum` zugeordnet ist. Sie können anschließend einen `DynamoDBContext` verwenden, um ein Element als `Document`-Objekt aus der Tabelle `Forum` abzurufen, wie im folgenden C\$1-Codebeispiel gezeigt.

**Example**  

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

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

## Optionale Parameter für Dynamo angeben DBContext
<a name="OptionalConfigParams"></a>

Wenn Sie das Object Persistence-Modell verwenden, können Sie für den `DynamoDBContext` folgende optionale Parameter angeben.
+ **`ConsistentRead` – **Beim Abrufen von Daten mithilfe der `Load`, `Query` oder `Scan`-Operation können Sie diesen Parameter optional hinzufügen, um die neuesten Werte der Daten anzufordern.
+ **`IgnoreNullValues` – **Dieser Parameter teilt `DynamoDBContext` mit, Null-Werte von Attributen während einer `Save`-Operation zu ignorieren. Wenn dieser Parameter „false“ oder nicht festgelegt ist, wird ein Nullwert als Anweisung interpretiert, das betreffende Attribut zu löschen. 
+ **`SkipVersionCheck`—** Dieser Parameter teilt `DynamoDBContext` mit, beim Speichern oder Löschen von Elementen keine Versionen zu vergleichen. Weitere Informationen über das Versioning finden Sie unter [Optimistisches Sperren mit DynamoDB und dem AWS SDK für .NET Objektpersistenzmodell](DynamoDBContext.VersionSupport.md).
+ **`TableNamePrefix` – ** Stellt allen Tabellennamen eine bestimmte Zeichenfolge voran. Wenn dieser Parameter Null ist (oder nicht festgelegt ist), dann wird kein Präfix verwendet.
+ `DynamoDBEntryConversion` – Gibt das Konvertierungsschema an, das vom Client verwendet wird. Sie können diesen Parameter auf Version V1 oder V2 festlegen. V1 ist die Standardversion.

  Je nach der von Ihnen festgelegten Version ändert sich das Verhalten dieses Parameters. Beispiel:
  + In V1 wird der Datentyp `bool` in den Zahlentyp `N` konvertiert, wobei 0 für falsch und 1 für wahr steht. In V2 wird `bool` in `BOOL` konvertiert.
  + In V2 werden Listen und Arrays nicht zusammen mit gruppiert. HashSets Listen und Arrays mit numerischen, auf Zeichenketten basierenden Typen und binären Typen werden in den Typ `L` (List) konvertiert, der leer gesendet werden kann, um eine Liste zu aktualisieren. Dies ist anders als bei V1, wo das Senden einer leeren Liste nicht möglich ist.

    In V1 werden Sammlungstypen wie List und Arrays gleich behandelt. HashSet Liste und HashSet Array von Zahlen werden in den Typ `NS` (Zahlensatz) konvertiert. 

  Im folgenden Beispiel wird die Version des Konvertierungsschemas auf V2 festgelegt, wodurch das Konvertierungsverhalten zwischen .NET-Typen und DynamoDB-Datentypen geändert wird.

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

Im folgenden C\$1-Codebeispiel wird durch Angabe von zwei der vorherigen optionalen Parameter, `ConsistentRead` und `SkipVersionCheck`, ein neuer Parameter `DynamoDBContext` erstellt.

**Example**  

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

`DynamoDBContext` berücksichtigt diese optionalen Parameter bei jeder Anforderung, die unter Verwendung dieses Kontextes gesendet werden. 

Anstatt diese Parameter auf der `DynamoDBContext`-Ebene festzulegen, können Sie diese mithilfe von `DynamoDBContext` für einzelne von Ihnen ausgeführte Operationen festlegen, wie im folgenden C\$1-Codebeispiel gezeigt. Das Beispiel lädt ein bestimmtes Book-Element. Die `Load`-Methode von `DynamoDBContext` gibt die optionalen Parameter `ConsistentRead` und `SkipVersionCheck` an.

**Example**  

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

In diesem Fall berücksichtigt `DynamoDBContext` diese Parameter ausschließlich beim Senden der `Get`-Anforderung.

# Optimistisches Sperren mit DynamoDB und dem AWS SDK für .NET Objektpersistenzmodell
<a name="DynamoDBContext.VersionSupport"></a>

Die Unterstützung der optimistischen Sperre im Object Persistence-Modell stellt sicher, dass die Elementversion für Ihre Anwendung dieselbe ist wie die serverseitige Elementversion, bevor das Element aktualisiert oder gelöscht wird. Angenommen, Sie rufen ein Element für eine Aktualisierung ab. Bevor Sie jedoch Ihre Aktualisierungen zurücksenden, aktualisiert eine andere Anwendung das gleiche Element. Jetzt verfügt Ihre Anwendung über eine veraltete Kopie des Elements. Ohne optimistische Sperre wird jede von Ihnen durchgeführte Aktualisierung die Aktualisierung von anderen Anwendungen überschreiben. 

Die Funktion "optimistische Sperre" des Object Persistence-Modells stellt den `DynamoDBVersion`-Tag bereit, den Sie für die Aktivierung der optimistische Sperre nutzen können. Um diese Funktion zu verwenden, fügen Sie Ihrer Klasse eine Eigenschaft hinzu, mit der die Versionsnummer gespeichert wird. Sie fügen der Eigenschaft das Attribut `DynamoDBVersion` hinzu. Wenn Sie das Element zum ersten Mal speichern, weist `DynamoDBContext` diesem eine Versionsnummer hinzu. Dieser Wert wird bei jeder Aktualisierung des Elements inkrementell erhöht. 

Ihre Aktualisierungs- oder Löschanforderungen werden nur erfolgreich ausgeführt, wenn die clientseitige Objektversion mit der entsprechenden Versionsnummer des Elements auf der Serverseite übereinstimmt. Wenn Ihre Anwendung über eine veraltete Kopie verfügt, muss sie die aktuelle Version vom Server erhalten, bevor sie das Element aktualisieren oder löschen kann.

Im folgenden C\$1-Codebeispiel wird die Klasse `Book` mit Object Persistence-Attributen definiert, die diese der Tabelle `ProductCatalog` zuordnen. Die Eigenschaft `VersionNumber` in der Klasse, die das `DynamoDBVersion`-Attribut aufweist, speichert den Wert der Versionsnummer.

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

**Anmerkung**  
Sie können das `DynamoDBVersion`-Attribut ausschließlich auf einen löschbaren numerischen primitiven Typen anwenden (z. B. `int?`). 

Die optimistische Sperre hat folgende Auswirkungen auf diese `DynamoDBContext`-Operationen:
+ Für ein neues Element weist `DynamoDBContext` die Erstversionsnummer 0 zu. Wenn Sie ein vorhandenes Element abrufen, eine oder mehrere von dessen Eigenschaften aktualisieren und versuchen, die Änderungen zu speichern, wird die Speicheroperation nur dann erfolgreich ausgeführt, wenn die client- und serverseitige Versionsnummer übereinstimmen. `DynamoDBContext` erhöht die Versionsnummer inkrementell. Sie müssen die Versionsnummer nicht festlegen.
+ Die Methode `Delete` stellt Überladungen bereit, die entweder einen Primärschlüsselwert oder ein Objekt als Parameter aufnehmen können, wie im folgenden C\$1-Codebeispiel gezeigt.  
**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);
  ```

  Wenn Sie ein Objekt als Parameter bereitstellen, ist der Löschvorgang nur dann erfolgreich, wenn die Objektversion mit der entsprechenden serverseitigen Elementversion übereinstimmt. Wenn Sie jedoch einen Primärschlüsselwert als Parameter bereitstellen, erkennt `DynamoDBContext` keine Versionsnummern und löscht das Element, ohne die Version zu prüfen. 

  Beachten Sie, dass die interne Implementierung von optimistischen Sperren in dem Code des Object-Persistence-Modells bedingte Aktualisierungen und bedingte Löschungs-API-Aktionen in DynamoDB verwendet.

## Deaktivieren der optimistischen Sperre
<a name="DotNetDynamoDBContext.DisablingOptimisticLocking"></a>

Um die optimistische Sperre zu deaktivieren, verwenden Sie die Konfigurationseigenschaft `SkipVersionCheck`. Sie können diese Eigenschaft bei der Erstellung von `DynamoDBContext` festlegen. In diesem Fall wird die optimistische Sperre für alle Anforderungen deaktiviert, die Sie unter Verwendung des Kontextes ausführen. Weitere Informationen finden Sie unter [Optionale Parameter für Dynamo angeben DBContext](DotNetDynamoDBContext.md#OptionalConfigParams). 

Anstatt die Eigenschaft auf der Kontextebene festzulegen, können Sie die optimistische Sperre für eine bestimmte Operation deaktivieren wie im folgenden C\$1-Codebeispiel gezeigt. Im Beispiel wird der Kontext verwendet, um ein Book-Element zu löschen. Die Methode `Delete` legt die optionale Eigenschaft `SkipVersionCheck` auf „true“ fest und deaktiviert damit die Versionsprüfung.

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

# Zuordnen beliebiger Daten mit DynamoDB mithilfe des AWS SDK für .NET Objektpersistenzmodells
<a name="DynamoDBContext.ArbitraryDataMapping"></a>

Zusätzlich zu den unterstützten .NET-Typen (siehe [Unterstützte Datentypen](DotNetSDKHighLevel.md#DotNetDynamoDBContext.SupportedTypes)) können Sie Typen in Ihrer Anwendung verwenden, für die es kein direktes Mapping zu Amazon-DynamoDB-Typen gibt. Das Object-Persistence-Modell unterstützt das Speichern von Daten mit beliebigen Typen, solange Sie einen Konverter bereitstellen, um Daten des beliebigen Typs in den DynamoDB-Typ und umgekehrt zu konvertieren. Der Konverter-Code wandelt Daten während des Speicherns und Ladens der Objekte um.

Sie können clientseitig alle Typen erstellen. Die in den Tabellen gespeicherten Daten haben jedoch einen DynamoDB-Datentyp. Während Abfragen und Scans werden alle Datenvergleiche anhand der in DynamoDB gespeicherten Daten ausgeführt.

Das folgende C\$1-Codebeispiel definiert eine `Book`-Klasse mit den Eigenschaften `Id`, `Title`, `ISBN` und `Dimension`. Die Eigenschaft `Dimension` gehört zum `DimensionType`, der die Eigenschaften `Height`, `Width` und `Thickness` beschreibt. Der Beispielcode stellt die Konverter-Methoden `ToEntry` und `FromEntry` bereit, um Daten zwischen den Zeichenfolgetypen `DimensionType` und DynamoDB zu konvertieren. Beispielsweise erstellt der Konverter beim Speichern einer `Book`-Instance eine `Dimension`-Zeichenfolge wie „8.5x11x.05“. Wenn Sie ein Book abrufen, wird die Zeichenfolge in eine `DimensionType`-Instance konvertiert.

Im Beispiel wird der `Book`-Typ der Tabelle `ProductCatalog` zugewiesen. Es speichert eine `Book`-Beispiel-Instance, ruft sie ab, aktualisiert ihre Abmessungen und speichert die aktualisierte `Book`-Instance erneut.



 step-by-stepAnweisungen zum Testen des folgenden Beispiels finden Sie unter. [.NET-Codebeispiele](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;
        }
    }
}
```