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á.
Alterações nas APIs de mapeamento do DynamoDB entre a versão 1 e a versão 2 do SDK para Java
Criar um cliente
| Caso de uso | V1 | V2 |
|---|---|---|
|
Instanciação normal |
|
|
|
Instanciação mínima |
|
|
|
Com transformador de atributo* |
|
|
*As extensões na V2 correspondem aproximadamente aos transformadores de atributos na V1. A seção Usar extensões para personalizar as operações do Cliente Aprimorado do DynamoDB contém mais informações sobre extensões na V2.
Estabelecer o mapeamento para tabela/índice do DynamoDB
Na V1, você especifica um nome de tabela do DynamoDB por meio de uma anotação de bean. Na V2, um método de fábrica, table(), produz uma instância de DynamoDbTable que representa a tabela remota do DynamoDB. O primeiro parâmetro do método table() é o nome da tabela do DynamoDB.
| Caso de uso | V1 | V2 |
|---|---|---|
|
Mapear a classe Java POJO para a tabela do DynamoDB |
|
|
|
Mapear para um índice secundário do DynamoDB |
A seção do Guia do desenvolvedor do DynamoDB que discute o método |
A seção Usar índices secundários deste guia fornece mais informações. |
Operações de tabela
Esta seção descreve as APIs de operação que diferem entre V1 e V2 na maioria dos casos de uso padrão.
Na V2, todas as operações que envolvem uma única tabela são chamadas na instância DynamoDbTable, não no cliente aprimorado. O cliente aprimorado contém métodos que podem ter como destino várias tabelas.
Na tabela chamada Operações de tabela abaixo, uma instância POJO é chamada de item ou como um tipo específico, como customer1. Para os exemplos da V2 de as instâncias nomeadas, table é o resultado de uma chamada anterior a enhancedClient.table() que retorna uma referência à instância DynamoDbTable.
Observe que a maioria das operações da V2 pode ser chamada com um padrão de consumidor fluente, mesmo quando não mostrado. Por exemplo,
Customer customer = table.getItem(r → r.key(key));
or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
Para operações da V1, as Operações de tabela (abaixo) contêm algumas das formas mais usadas, mas não todas as formas com sobrecargas. Por exemplo, o método load() tem as seguintes sobrecargas:
mapper.load(Customer.class, hashKey)
mapper.load(Customer.class, hashKey, rangeKey)
mapper.load(Customer.class, hashKey, config)
mapper.load(Customer.class, hashKey, rangeKey, config)
mapper.load(item)
mapper.load(item, config)
As Operações de tabela (abaixo) mostram as formas comumente usados:
mapper.load(item) mapper.load(item, config)
| Caso de uso | V1 | V2 |
|---|---|---|
|
Gravar um Java POJO em uma tabela do DynamoDB Operação do DynamoDB: |
Na V1, |
|
|
Ler um item de uma tabela do DynamoDB para um Java POJO Operação do DynamoDB: |
|
|
|
Excluir um item de uma tabela do DynamoDB Operação do DynamoDB: |
|
|
|
Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada Operação do DynamoDB: |
|
Usar o |
|
Consultar uma tabela ou um índice secundário do DynamoDB e retornar uma lista Operação do DynamoDB: |
|
Usar o |
|
Verificar uma tabela ou um índice secundário do DynamoDB e retornar uma lista paginada Operação do DynamoDB: |
|
Usar o |
|
Fazer uma varredura de uma tabela ou um índice secundário do DynamoDB e retornar uma lista Operação do DynamoDB: |
|
Usar o |
|
Ler vários itens de várias tabelas em um lote Operação do DynamoDB: |
|
|
|
Gravar vários itens em várias tabelas em um lote Operação do DynamoDB: |
|
|
|
Excluir vários itens de várias tabelas em um lote Operação do DynamoDB: |
|
|
|
Gravar/excluir vários itens em um lote Operação do DynamoDB: |
|
|
|
Fazer uma gravação transacional Operação do DynamoDB: |
|
|
|
Fazer uma leitura transacional Operação do DynamoDB: |
|
|
|
Obter uma contagem de itens correspondentes de uma consulta Operação do DynamoDB: |
|
|
|
Obter uma contagem de itens correspondentes de uma varredura Operação do DynamoDB: |
|
|
|
Criar uma tabela no DynamoDB correspondente à classe POJO Operação do DynamoDB: |
A declaração anterior gera uma solicitação de criação de tabela de baixo nível; os usuários devem chamar |
|
|
Fazer uma varredura paralela no DynamoDB Operação do DynamoDB: |
|
Os usuários devem gerenciar as threads de operador e chamar
|
|
Integrar o Amazon S3 com o DynamoDB para armazenar links inteligentes do S3 |
|
Incompatível porque combina o Amazon S3 e o DynamoDB. |
Classes e propriedades de mapa
Tanto na V1 quanto na V2, você mapeia classes para tabelas usando anotações no estilo bean. A V2 também oferece outras formas de definir esquemas para casos de uso específicos, como trabalhar com classes imutáveis.
Anotações de bean
A tabela a seguir mostra as anotações de bean equivalentes para um caso de uso específico que são usadas na V1 e na V2. Um cenário de classe Customer é usado para ilustrar os parâmetros.
As anotações, assim como as classes e enumerações, na V2 seguem a convenção de casos camel e usam “DynamoDb”, não “DynamoDB”.
| Caso de uso | V1 | V2 |
|---|---|---|
| Mapear classe para tabela |
|
O nome da tabela é definido ao chamar o método DynamoDbEnhancedClient#table(). |
| Designar um membro da classe como um atributo da tabela |
|
|
| Designar um membro da classe é uma chave de partição/hash |
|
|
| Designar um membro da classe é uma chave de classificação/intervalo |
|
|
| Designar um membro da classe é uma chave de partição/hash de índice secundário |
|
|
| Designar um membro da classe é uma chave de classificação/intervalo de índice secundário |
|
|
| Ignorar esse membro da classe ao mapear para uma tabela |
|
|
| Designar um membro da classe como um atributo de chave UUID gerado automaticamente |
|
A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente. |
| Designar um membro da classe como um atributo de carimbo de data e hora gerado automaticamente |
|
A extensão que fornece isso não é carregada por padrão; você deve adicionar a extensão ao compilador de cliente. |
| Designar um membro da classe como um atributo de versão incrementado automaticamente |
|
A extensão que fornece isso é carregada automaticamente. |
| Designar um membro da classe como solicitando uma conversão personalizada |
|
|
| Designar um membro da classe para ser armazenado como um tipo de atributo diferente |
|
Use uma implementação |
| Designar uma classe que possa ser serializada em um documento do DynamoDB (documento no estilo JSON) ou subdocumento |
|
Use a API de documento aprimorado. Consulte os recursos a seguir:
|
Anotações adicionais da V2
| Caso de uso | V1 | V2 |
|---|---|---|
| Designar um membro da classe para não ser armazenado como um atributo NULL se o valor Java for nulo | N/D |
|
| Designar um membro da classe para ser um objeto vazio se todos os atributos forem nulos | N/D |
|
| Designar uma ação especial de atualização para um membro da classe | N/D |
|
| Designar uma classe imutável | N/D |
|
| Designar um membro da classe como um atributo de contador incrementado automaticamente | N/D |
A extensão que fornece essa funcionalidade é carregada automaticamente. |
Configuração
Na V1, você geralmente controla comportamentos específicos usando uma instância de DynamoDBMapperConfig. Você pode fornecer o objeto de configuração ao criar o mapeador ou ao fazer uma solicitação. Na V2, a configuração é específica para o objeto de solicitação da operação.
| Caso de uso | V1 | Padrão na V1 | V2 |
|---|---|---|---|
|
|||
| Estratégia de nova tentativa de carregamento/gravação em lote |
|
fazer novas tentativas de itens com falha | Configure a estratégia de novas tentativas no DynamoDBClient subjacente. Veja Configurar o comportamento de novas tentativas no AWS SDK for Java 2.x neste guia. |
| Leituras consistentes |
|
EVENTUAL |
Por padrão, leituras consistentes são falsas para operações de leitura. Substitua por .consistentRead(true) no objeto de solicitação. |
| Esquema de conversão com conjuntos de marshallers/unmarshallers |
As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas. |
V2_COMPATIBLE |
Não aplicável. Esse é um recurso legado que se refere à forma como as versões mais antigas do DynamoDB (V1) armazenavam os tipos de dados, e esse comportamento não será preservado no cliente aprimorado. Um exemplo de comportamento no DynamoDB V1 é armazenar boolianos como número em vez de boolianos. |
| Nomes das tabelas |
As implementações estáticas fornecem compatibilidade retroativa com versões mais antigas |
usar anotação ou suposição da classe |
O nome da tabela é definido ao chamar o método |
| Estratégia de carregamento de paginação |
As opções são: LAZY_ |
LAZY_LOADING |
|
| Solicitar coleta de métricas |
|
null |
Use metricPublisher() em ClientOverrideConfiguration ao criar o cliente padrão do DynamoDB. |
| Comportamento de salvamento |
As opções são |
UPDATE |
Na V2, você chama
|
| Fábrica de conversão de tipo |
|
conversores de tipo padrão |
Definir o bean usando
|
Configuração por operação
Na V1, algumas operações, como query(), são altamente configuráveis por meio de um objeto de “expressão” enviado à operação. Por exemplo:
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>() .withRangeKeyCondition("Email", new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList( new AttributeValue().withS("my"))); mapper.query(Customer.class, emailBwQueryExpr);
Na V2, em vez de usar um objeto de configuração, você define parâmetros no objeto de solicitação usando um compilador. Por exemplo:
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder() .queryConditional(QueryConditional .sortBeginsWith(kb -> kb .sortValue("my"))).build(); customerTable.query(emailBw);
Condicionais
Na V2, as expressões condicionais e de filtragem são expressas usando um objeto Expression, que encapsula a condição e o mapeamento de nomes e filtros.
| Caso de uso | Operações | V1 | V2 |
|---|---|---|---|
| Condições de atributo esperadas | save(), delete(), query(), scan() |
|
Obsoleto; use ConditionExpression em vez disso. |
| Expressão de condição | delete() |
|
|
| Expressão de filtro | query(), scan() |
|
|
| Expressão de condição para consulta | query() |
|
|
Conversão de tipo
Conversores padrão
Na V2, o SDK fornece um conjunto de conversores padrão para todos os tipos comuns. É possível alterar os conversores de tipo tanto no nível geral do provedor quanto em um único atributo. Você pode encontrar uma lista dos conversores disponíveis na referência da API AttributeConverter
Definir um conversor personalizado para um atributo
Na V1, é possível e anotar um método getter com @DynamoDBTypeConverted para especificar a classe que é convertida entre o tipo de atributo Java e o tipo de atributo do DynamoDB. Por exemplo, um CurrencyFormatConverter que converte entre um tipo Java Currency e uma string do DynamoDB pode ser aplicada conforme mostrado no trecho a seguir.
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
O equivalente da V2 do trecho anterior é mostrado abaixo.
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
nota
Na V1, é possível aplicar a anotação ao próprio atributo, a um tipo ou a uma anotação definida pelo usuário. A V2 permite a aplicação da anotação somente ao getter.
Adicionar uma fábrica ou fornecedor de conversor de tipo
Na V1, você pode fornecer seu próprio conjunto de conversores de tipo, ou substituir os tipos que forem importantes para você adicionando uma fábrica de conversores de tipo à configuração. A fábrica do conversor de tipos amplia DynamoDBTypeConverterFactory e as substituições são feitas obtendo uma referência ao conjunto padrão e ampliando-o. O trecho a seguir demonstra como fazer isso.
DynamoDBTypeConverterFactory typeConverterFactory =
DynamoDBTypeConverterFactory.standard().override()
.with(String.class, CustomBoolean.class, new DynamoDBTypeConverter<String, CustomBoolean>() {
@Override
public String convert(CustomBoolean bool) {
return String.valueOf(bool.getValue());
}
@Override
public CustomBoolean unconvert(String string) {
return new CustomBoolean(Boolean.valueOf(string));
}}).build();
DynamoDBMapperConfig config =
DynamoDBMapperConfig.builder()
.withTypeConverterFactory(typeConverterFactory)
.build();
DynamoDBMapper mapperWithTypeConverterFactory = new DynamoDBMapper(dynamo, config);
A V2 fornece funcionalidade semelhante por meio da anotação @DynamoDbBean. Você pode fornecer um único AttributeConverterProvider ou uma cadeia de AttributeConverterProviders ordenados. Observe que, se fornecer sua própria cadeia de provedores de conversão de atributos, você substituirá o provedor de conversão padrão, e deve incluí-lo na cadeia para usar os conversores de atributos.
@DynamoDbBean(converterProviders = {
ConverterProvider1.class,
ConverterProvider2.class,
DefaultAttributeConverterProvider.class})
public class Customer {
...
}
A seção sobre conversão de atributos neste guia contém um exemplo completo para a V2.