Arbeiten Sie mit unveränderlichen Datenklassen - AWS SDK for Java 2.x

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

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

  2. Jeder Getter muss einen entsprechenden Setter in der Builder-Klasse haben, bei der Groß- und Kleinschreibung berücksichtigt wird.

  3. 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 habenbuilder(), die keine Parameter akzeptiert und eine Instanz der Builder-Klasse zurückgibt. Diese Option wird in der unveränderlichen Customer Klasse angezeigt.

  4. Die Builder-Klasse muss eine öffentliche Methode mit dem Namen habenbuild(), 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, helfen dabei, Standardcode zu generieren, der unveränderlichen Objekten zugeordnet ist. Die DynamoDB Enhanced Client API funktioniert mit diesen Bibliotheken, solange die Datenklassen den in diesem Abschnitt beschriebenen Konventionen entsprechen.

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