Gere um TableSchema a partir de uma classe de dados - AWS SDK for Java 2.x

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Gere um TableSchema a partir de uma classe de dados

O TableSchema permite que o cliente avançado mapeie valores de atributos do DynamoDB de e para suas classes do lado do cliente. Neste tutorial, você aprenderá sobre TableSchemas derivados de uma classe de dados estática e gerados a partir de código usando um construtor.

Usar uma classe de dados anotada

O SDK para Java 2.x inclui um conjunto de anotações que você pode usar com uma classe de dados para gerar um TableSchema de modo rápido para mapear suas classes usando tabelas.

Comece criando uma classe de dados que esteja em conformidade com a JavaBean especificação. A especificação exige que uma classe tenha um construtor público sem argumentos e que tenha getters e setters para cada atributo na classe. Inclua uma anotação de classe para indicar que a classe de dados é uma DynamoDbBean. Além disso, no mínimo, inclua uma anotação DynamoDbPartitionKey no getter ou setter do atributo da chave primária.

Você pode aplicar anotações em nível de atributo a getters ou setters, mas não a ambos.

nota

O termo property é normalmente usado para um valor encapsulado em um. JavaBean No entanto, no lugar desse termo, este guia usa o termo attribute, para ser consistente com a terminologia usada pelo DynamoDB.

A Customer classe a seguir mostra anotações que vinculam a definição da classe a uma tabela do DynamoDB.

Classe Customer

package org.example.tests.model; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey; import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey; import java.time.Instant; @DynamoDbBean public class Customer { private String id; private String name; private String email; private Instant regDate; @DynamoDbPartitionKey public String getId() { return this.id; } public void setId(String id) { this.id = id; } public String getCustName() { return this.name; } public void setCustName(String name) { this.name = name; } @DynamoDbSortKey public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public Instant getRegistrationDate() { return this.regDate; } public void setRegistrationDate(Instant registrationDate) { this.regDate = registrationDate; } @Override public String toString() { return "Customer [id=" + id + ", name=" + name + ", email=" + email + ", regDate=" + regDate + "]"; } }

Depois de criar uma classe de dados anotada, use-a para criar o TableSchema, como será mostrado no trecho a seguir.

static final TableSchema<Customer> customerTableSchema = TableSchema.fromBean(Customer.class);

Um TableSchema é projetado para ser estático e imutável. Normalmente, você pode instanciá-lo no momento do carregamento da classe.

O método static TableSchema.fromBean() factory faz uma introspecção do bean para gerar o mapeamento dos atributos (propriedades) da classe de dados de e para os atributos do DynamoDB.

Para ver um exemplo de como trabalhar com um modelo de dados composto por várias classes de dados, consulte a classe Person na seção Trabalhar com atributos aninhados.

Usar um construtor

Você pode ignorar o custo da introspecção do bean se definir o esquema da tabela no código. Se você codificar o esquema, sua classe não precisará seguir os padrões de JavaBean nomenclatura nem precisará ser anotada. O exemplo a seguir usa um construtor e é equivalente ao exemplo de classe Customer que usa anotações.

static final TableSchema<Customer> customerTableSchema = TableSchema.builder(Customer.class) .newItemSupplier(Customer::new) .addAttribute(String.class, a -> a.name("id") .getter(Customer::getId) .setter(Customer::setId) .tags(StaticAttributeTags.primaryPartitionKey())) .addAttribute(String.class, a -> a.name("email") .getter(Customer::getEmail) .setter(Customer::setEmail) .tags(StaticAttributeTags.primarySortKey())) .addAttribute(String.class, a -> a.name("name") .getter(Customer::getCustName) .setter(Customer::setCustName)) .addAttribute(Instant.class, a -> a.name("registrationDate") .getter(Customer::getRegistrationDate) .setter(Customer::setRegistrationDate)) .build();