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.
Arbeiten Sie mit unveränderlichen Datenklassen
Die Mapping-Funktion der DynamoDB Enhanced Client API funktioniert mit unveränderlichen Datenklassen. Eine unveränderliche Klasse hat nur Getter und erfordert eine Builder-Klasse, die das SDK verwendet, um Instanzen der Klasse zu erstellen. Anstatt die @DynamoDbBean
Annotation zu verwenden, wie in der Customer-Klasse gezeigt, verwenden unveränderliche Klassen die @DynamoDbImmutable
Annotation, die einen Parameter verwendet, der angibt, welche Builder-Klasse verwendet werden soll.
Die folgende Klasse ist eine unveränderliche Version von. Customer
package org.example.tests.model.immutable; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbImmutable; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSecondaryPartitionKey; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSecondarySortKey; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey; import java.time.Instant; @DynamoDbImmutable(builder = CustomerImmutable.Builder.class) public class CustomerImmutable { private final String id; private final String name; private final String email; private final Instant regDate; private CustomerImmutable(Builder b) { this.id = b.id; this.email = b.email; this.name = b.name; this.regDate = b.regDate; } // This method will be automatically discovered and used by the TableSchema. public static Builder builder() { return new Builder(); } @DynamoDbPartitionKey public String id() { return this.id; } @DynamoDbSortKey public String email() { return this.email; } @DynamoDbSecondaryPartitionKey(indexNames = "customers_by_name") public String name() { return this.name; } @DynamoDbSecondarySortKey(indexNames = {"customers_by_date", "customers_by_name"}) public Instant regDate() { return this.regDate; } public static final class Builder { private String id; private String email; private String name; private Instant regDate; // The private Builder constructor is visible to the enclosing CustomerImmutable class. private Builder() {} public Builder id(String id) { this.id = id; return this; } public Builder email(String email) { this.email = email; return this; } public Builder name(String name) { this.name = name; return this; } public Builder regDate(Instant regDate) { this.regDate = regDate; return this; } // This method will be automatically discovered and used by the TableSchema. public CustomerImmutable build() { return new CustomerImmutable(this); } } }
Sie müssen die folgenden Anforderungen erfüllen, wenn Sie eine Datenklasse mit annotieren. @DynamoDbImmutable
-
Jede Methode, bei der es sich nicht um eine Überschreibung von handelt
Object.class
und die nicht mit einer Anmerkung versehen wurde,@DynamoDbIgnore
muss ein Getter für ein Attribut der DynamoDB-Tabelle sein. -
Jeder Getter muss einen entsprechenden Setter in der Builder-Klasse haben, bei der Groß- und Kleinschreibung berücksichtigt wird.
-
Nur eine der folgenden Konstruktionsbedingungen muss erfüllt sein.
-
Die Builder-Klasse muss über einen öffentlichen Standardkonstruktor verfügen.
-
Die Datenklasse muss eine öffentliche statische Methode mit dem Namen haben
builder()
, die keine Parameter akzeptiert und eine Instanz der Builder-Klasse zurückgibt. Diese Option wird in der unveränderlichenCustomer
Klasse angezeigt.
-
-
Die Builder-Klasse muss eine öffentliche Methode mit dem Namen haben
build()
, die keine Parameter akzeptiert und eine Instanz der unveränderlichen Klasse zurückgibt.
Um eine TableSchema
für Ihre unveränderliche Klasse zu erstellen, verwenden Sie die fromImmutableClass()
Methode on, TableSchema
wie im folgenden Codeausschnitt gezeigt.
static final TableSchema<CustomerImmutable> customerImmutableTableSchema = TableSchema.fromImmutableClass(CustomerImmutable.class);
So wie Sie eine DynamoDB-Tabelle aus einer veränderbaren Klasse erstellen können, können Sie eine aus einer unveränderlichen Klasse mit einem einmaligen Aufruf von createTable()
of erstellen, DynamoDbTable
wie im folgenden Codefragmentbeispiel gezeigt.
static void createTableFromImmutable(DynamoDbEnhancedClient enhancedClient, String tableName, DynamoDbWaiter waiter){ // First, create an in-memory representation of the table using the 'table()' method of the DynamoDb Enhanced Client. // 'table()' accepts a name for the table and a TableSchema instance that you created previously. DynamoDbTable<CustomerImmutable> customerDynamoDbTable = enhancedClient .table(tableName, TableSchema.fromImmutableClass(CustomerImmutable.class)); // Second, call the 'createTable()' method on the DynamoDbTable instance. customerDynamoDbTable.createTable(); waiter.waitUntilTableExists(b -> b.tableName(tableName)); }
Verwenden Sie Bibliotheken von Drittanbietern wie Lombok
Bibliotheken von Drittanbietern, wie Project Lombok
Das folgende Beispiel zeigt die unveränderliche CustomerImmutable
Klasse mit Lombok-Anmerkungen. Beachten Sie, wie die onMethod
Funktion von Lombok attributbasierte DynamoDB-Anmerkungen, wie z. B., in den generierten Code kopiert. @DynamoDbPartitionKey
@Value @Builder @DynamoDbImmutable(builder = Customer.CustomerBuilder.class) public class Customer { @Getter(onMethod_=@DynamoDbPartitionKey) private String id; @Getter(onMethod_=@DynamoDbSortKey) private String email; @Getter(onMethod_=@DynamoDbSecondaryPartitionKey(indexNames = "customers_by_name")) private String name; @Getter(onMethod_=@DynamoDbSecondarySortKey(indexNames = {"customers_by_date", "customers_by_name"})) private Instant createdDate; }