Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.
Cambios en las API de asignación de DynamoDB entre las versiones 1 y 2 del SDK para Java
Crear un cliente
| Caso de uso | V1 | V2 |
|---|---|---|
|
Instanciación normal |
|
|
|
Instanciación mínima |
|
|
|
Con transformador de atributos* |
|
|
*Las extensiones de V2 corresponden aproximadamente a los transformadores de atributos de V1. La sección Uso de extensiones para personalizar operaciones de DynamoDB Enhanced Client contiene más información sobre extensiones de V2.
Establecimiento de asignación a tabla/índice de DynamoDB
En V1, se especifica un nombre de tabla de DynamoDB mediante una anotación de bean. En V2, un método de fábrica, table(), produce una instancia de DynamoDbTable que representa la tabla remota de DynamoDB. El primer parámetro del método table() es el nombre de tabla de DynamoDB.
| Caso de uso | V1 | V2 |
|---|---|---|
|
Asignar la clase POJO de Java a la tabla de DynamoDB |
|
|
|
Asignar a un índice secundario de DynamoDB |
En la sección de la Guía para desarrolladores de DynamoDB que analiza el método de |
En la sección Usar índices secundarios de esta guía se proporciona más información. |
Operaciones de tabla
En esta sección se describen las API de operación que difieren entre la V1 y la V2 en la mayoría de los casos de uso estándar.
En la V2, todas las operaciones que implican una sola tabla se llaman en la instancia de DynamoDbTable, no en el cliente mejorado. El cliente mejorado contiene métodos que pueden referirse a varias tablas.
En la tabla denominada Operaciones de tabla que aparece a continuación, se hace referencia a una instancia de POJO como item o como tipo específico, por ejemplo customer1. En los ejemplos de la V2, la instancia llamada table es resultado de una llamada anterior a enhancedClient.table() que devuelve una referencia a la instancia DynamoDbTable.
Tenga en cuenta que la mayoría de las operaciones de la V2 se pueden llamar con un patrón de consumo fluido, incluso cuando no se muestran. Por ejemplo:
Customer customer = table.getItem(r → r.key(key));
or
Customer customer = table.getItem(r → r.key(k -> k.partitionValue("id").sortValue("email")))
Para las operaciones de la V1, Operaciones de tabla (a continuación) contiene algunos de los formularios más utilizados y no todos los formularios sobrecargados. Por ejemplo, el método load() presenta las siguientes 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)
Operaciones de tabla (a continuación) muestra los formularios más utilizados:
mapper.load(item) mapper.load(item, config)
| Caso de uso | V1 | V2 |
|---|---|---|
|
Escribir un POJO de Java en una tabla de DynamoDB Operación de DynamoDB: |
En la V1, |
|
|
Leer un elemento de una tabla de DynamoDB a un POJO de Java Operación de DynamoDB: |
|
|
|
Eliminar un elemento de una tabla de DynamoDB Operación de DynamoDB: |
|
|
|
Consultar una tabla o un índice secundario de DynamoDB y devolución de una lista paginada Operación de DynamoDB: |
|
Usar el |
|
Consultar una tabla o un índice secundario de DynamoDB y devolver una lista Operación de DynamoDB: |
|
Usar el |
|
Analizar una tabla o un índice secundario de DynamoDB y devolver una lista paginada Operación de DynamoDB: |
|
Usar el |
|
Analizar una tabla o un índice secundario de DynamoDB y devolver una lista Operación de DynamoDB: |
|
Usar el |
|
Leer varios elementos de varias tablas de un lote Operación de DynamoDB: |
|
|
|
Escribir varios elementos en varias tablas de un lote Operación de DynamoDB: |
|
|
|
Eliminar varios elementos de varias tablas de un lote Operación de DynamoDB: |
|
|
|
Escribir/eliminar varios elementos de un lote Operación de DynamoDB: |
|
|
|
Realizar una escritura transaccional Operación de DynamoDB: |
|
|
|
Realizar una lectura transaccional Operación de DynamoDB: |
|
|
|
Obtener un recuento de elementos coincidentes de una consulta Operación de DynamoDB: |
|
|
|
Obtener un recuento de elementos coincidentes de un análisis Operación de DynamoDB: |
|
|
|
Crear una tabla en DynamoDB correspondiente a la clase POJO Operación de DynamoDB: |
La instrucción anterior genera una solicitud de creación de tabla de bajo nivel; los usuarios deben llamar a |
|
|
Realizar un análisis paralelo en DynamoDB Operación de DynamoDB: |
|
Los usuarios deben administrar los subprocesos de trabajo y llamar a
|
|
Integración de Amazon S3 con DynamoDB para almacenar enlaces de S3 inteligentes |
|
No se admite porque acopla Amazon S3 y DynamoDB. |
Asignación de clases y propiedades
Tanto en la V1 como en la V2, las clases se asignan a tablas mediante anotaciones de tipo bean. La V2 también ofrece otras formas de definir esquemas para casos de uso específicos, como trabajar con clases inmutables.
Anotaciones de bean
La siguiente tabla muestra las anotaciones de bean equivalentes para un caso de uso específico que se utilizan en V1 y V2. Se utiliza un escenario de clase de Customer para ilustrar parámetros.
Las anotaciones, así como las clases y las enumeraciones, de la V2 siguen la convención de mayúsculas y minúsculas en camello y utilizan “DynamoDb”, no “DynamoDB”.
| Caso de uso | V1 | V2 |
|---|---|---|
| Asignar clase a tabla |
|
El nombre de la tabla se define al llamar al método DynamoDbEnhancedClient#table(). |
| Designar un miembro de clase como atributo de tabla |
|
|
| Designar un miembro de clase como clave de hash/partición |
|
|
| Designar un miembro de clase como clave de rango/clasificación |
|
|
| Designar un miembro de clase como clave de hash/partición de índice secundario |
|
|
| Designar un miembro de clase como clave de rango/clasificación de índice secundario |
|
|
| Ignorar este miembro de clase al asignarlo a una tabla |
|
|
| Designar un miembro de clase como atributo clave UUID generado automáticamente |
|
La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al compilador de clientes. |
| Designar un miembro de clase como atributo de marca de tiempo generado automáticamente |
|
La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al compilador de clientes. |
| Designar un miembro de clase como atributo de versión con incremento automático |
|
La extensión que proporciona esto se carga automáticamente. |
| Designar que un miembro de clase requiere una conversión personalizada |
|
|
| Designar que un miembro de clase se almacene como otro tipo de atributo |
|
Utilice una implementación de |
| Designe una clase que se pueda serializar en un documento (documento de estilo JSON) o subdocumento de DynamoDB |
|
Uso de la API de Documento mejorado Consulte los siguientes recursos:
|
Anotaciones adicionales de la V2
| Caso de uso | V1 | V2 |
|---|---|---|
| Designar que un miembro de clase no se almacene como atributo NULL si el valor de Java es nulo | N/A |
|
| Designar un miembro de clase como objeto vacío si todos los atributos son nulos | N/A |
|
| Designar una acción de actualización especial para un miembro de clase | N/A |
|
| Designar una clase inmutable | N/A |
|
| Designar un miembro de clase como atributo de contador de incremento automático | N/A |
La extensión que proporciona esto se carga automáticamente. |
Configuración
En la V1, generalmente se controlan comportamientos específicos mediante una instancia de DynamoDBMapperConfig. Puede proporcionar el objeto de configuración al crear el asignador o al realizar una solicitud. En la V2, la configuración es específica del objeto de solicitud de la operación.
| Caso de uso | V1 | Predeterminado en V1 | V2 |
|---|---|---|---|
|
|||
| Estrategia de reintento de carga/escritura por lotes |
|
reintento de elementos fallidos | Configure la estrategia de reintento en el DynamoDBClient subyacente. Consulte Configuración del comportamiento de reintento en AWS SDK for Java 2.x en esta guía. |
| Lecturas consistentes |
|
EVENTUAL |
De forma predeterminada, las lecturas consistentes son falsas para operaciones de lectura. Anule con .consistentRead(true) en el objeto de solicitud. |
| Esquema de conversión con conjuntos de serializadores/deserializadores |
Las implementaciones estáticas proporcionan compatibilidad con versiones anteriores. |
V2_COMPATIBLE |
No se usa. Se trata de una función antigua que hace referencia a la forma en que las primeras versiones de DynamoDB (V1) almacenaban los tipos de datos, y este comportamiento no se conservará en el cliente mejorado. Un ejemplo de comportamiento en DynamoDB V1 es almacenar los valores booleanos como número en lugar de como booleanos. |
| Nombres de tablas |
Las implementaciones estáticas proporcionan compatibilidad con versiones anteriores |
usa anotación o estimación a partir de la clase |
El nombre de la tabla se define al llamar al método |
| Estrategia de carga de paginación |
Las opciones son: LAZY_, |
LAZY_LOADING |
|
| Solicitud de recopilación de métricas |
|
null |
Use metricPublisher() en ClientOverrideConfiguration al crear el cliente estándar de DynamoDB. |
| Comportamiento de guardado |
Las opciones son |
UPDATE |
En la V2, se llama a
|
| Fábrica de convertidores de tipos |
|
convertidores de tipos estándar |
Establezca el bean utilizando
|
Configuración por operación
En la V1, algunas operaciones, por ejemplo, query(), son altamente configurables mediante un objeto de “expresión” enviado a la operación. Por ejemplo:
DynamoDBQueryExpression<Customer> emailBwQueryExpr = new DynamoDBQueryExpression<Customer>() .withRangeKeyCondition("Email", new Condition() .withComparisonOperator(ComparisonOperator.BEGINS_WITH) .withAttributeValueList( new AttributeValue().withS("my"))); mapper.query(Customer.class, emailBwQueryExpr);
En la V2, en lugar de utilizar un objeto de configuración, se establecen parámetros en el objeto de solicitud mediante un generador. Por ejemplo:
QueryEnhancedRequest emailBw = QueryEnhancedRequest.builder() .queryConditional(QueryConditional .sortBeginsWith(kb -> kb .sortValue("my"))).build(); customerTable.query(emailBw);
Condicionales
En la V2, las expresiones condicionales y de filtrado se expresan mediante un objeto Expression, que encapsula la condición y la asignación de nombres y filtros.
| Caso de uso | Operaciones | V1 | V2 |
|---|---|---|---|
| Condiciones de atributo esperadas | save(), delete(), query(), scan() |
|
Obsoleto; utilice ConditionExpression en su lugar. |
| Expresión de condición | delete() |
|
|
| Expresión de filtro | query(), scan() |
|
|
| Expresión de condición para consulta | query() |
|
|
Conversión de tipos
Convertidores predeterminados
En la V2, el SDK proporciona un conjunto de convertidores predeterminados para todos los tipos comunes. Puede cambiar los convertidores de tipos tanto en el nivel de proveedor general como para un único atributo. Encontrará una lista de los convertidores disponibles en la referencia de la API AttributeConverter
Establecimiento de un conversor personalizado para un atributo
En la V1, puede anotar un método getter con @DynamoDBTypeConverted para especificar la clase que convierte entre el tipo de atributo de Java y un tipo de atributo de DynamoDB. Por ejemplo, se puede aplicar un CurrencyFormatConverter que convierta entre un tipo Currency de Java y una cadena de DynamoDB, como se muestra en el siguiente fragmento de código.
@DynamoDBTypeConverted(converter = CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
A continuación se muestra el equivalente en V2 del fragmento anterior.
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
nota
En la V1 puede aplicar la anotación al atributo en sí, a un tipo o a una anotación definida por el usuario, mientras que en la V2 solo se puede aplicar la anotación al getter.
Adición de una fábrica o un proveedor de convertidores de tipos
En la V1 puede proporcionar su propio conjunto de convertidores de tipos o anular los tipos que le interesen añadiendo una fábrica de convertidores de tipos a la configuración. La fábrica de convertidores de tipos amplía DynamoDBTypeConverterFactory y las anulaciones se realizan tomando una referencia al conjunto predeterminado y ampliándola. En el siguiente fragmento de código se muestra cómo hacerlo.
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);
La V2 proporciona una funcionalidad similar a través de la anotación @DynamoDbBean. Puede proporcionar un AttributeConverterProvider único o una cadena de AttributeConverterProvider en orden. Tenga en cuenta que si suministra su propia cadena de proveedores de convertidores de atributos, anulará el proveedor de convertidores predeterminado y deberá incluirlo en la cadena para utilizar sus convertidores de atributos.
@DynamoDbBean(converterProviders = {
ConverterProvider1.class,
ConverterProvider2.class,
DefaultAttributeConverterProvider.class})
public class Customer {
...
}
La sección sobre conversión de atributos de esta guía contiene un ejemplo completo para la V2.