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 el APIs mapeo o el documento de DynamoDB de la versión 1 a la versión 2
En este tema se detallan los cambios en el nivel superior SDK de Java APIs para Amazon DynamoDB desde la versión 1.x (v1) a AWS SDK for Java 2.x la (v2). En primer lugar, abordaremos el object-to-table mapeo API y, a continuación, analizaremos el documento API para trabajar con JSON documentos de estilo.
Cambios de alto nivel
Los nombres del cliente de mapeo de cada biblioteca difieren en la versión 1 y en la versión 2:
-
v1 - D ynamoDBMapper
-
v2: cliente mejorado de DynamoDB
Se interactúa con las dos bibliotecas prácticamente de la misma manera: se crea una instancia de un mapeador/cliente y, a continuación, se proporciona un código Java POJO para leer y escribir estos elementos en APIs las tablas de DynamoDB. Ambas bibliotecas también ofrecen anotaciones para la clase de para indicar la forma en que el cliente gestiona laPOJO. POJO
Las diferencias notables al pasar a la versión 2 incluyen:
-
V2 y v1 utilizan nombres de métodos diferentes para las operaciones de bajo nivel de DynamoDB. Por ejemplo:
v1 v2 carga getItem save putItem batchLoad batchGetItem -
La versión 2 ofrece varias formas de definir esquemas de tablas y mapearlos en tablas. POJOs Puede elegir entre el uso de anotaciones o un esquema generado a partir del código mediante un generador. V2 también ofrece versiones mutables e inmutables de los esquemas.
-
En la versión 2, se crea específicamente el esquema de la tabla como uno de los primeros pasos, mientras que en la versión 1, el esquema de la tabla se deduce de la clase anotada según sea necesario.
-
La versión 2 incluye el APIcliente Document
en el cliente mejoradoAPI, mientras que la versión 1 utiliza un cliente independiente. API -
Todos APIs están disponibles en versiones síncronas y asíncronas en la versión 2.
Consulte la sección de mapeo de DynamoDB en esta guía para obtener información más detallada sobre el cliente mejorado de la versión 2.
Importación de dependencias
v1 | v2 |
---|---|
|
|
En la versión 1, una sola dependencia incluye tanto el API DynamoDB de bajo nivel como la asignación API o el documento, mientras que en la versión 2, se usa dynamodb-enhanced
la dependencia del artefacto para acceder a la asignación o el documento. API El dynamodb-enhanced
módulo contiene una dependencia transitiva del módulo de bajo nivel. dynamodb
APIcambios
Crear un cliente
Caso de uso | v1 | v2 |
---|---|---|
Instanciación normal |
|
|
Instanciación mínima |
|
|
Con el transformador de atributos * |
|
|
* Las extensiones de la versión 2 corresponden aproximadamente a los transformadores de atributos de la versión 1. La Usar extensiones sección contiene más información sobre las extensiones de la versión 2.
Establecer el mapeo a la tabla/índice de DynamoDB
En la versión 1, se especifica el nombre de una tabla de DynamoDB mediante una anotación de bean. En la versión 2, un método de fábricatable()
, produce una instancia DynamoDbTable
que representa la tabla remota de DynamoDB. El primer parámetro del table()
método es el nombre de la tabla de DynamoDB.
Caso de uso | v1 | v2 |
---|---|---|
Asigne la POJO clase Java a la tabla de DynamoDB |
|
|
Asignación a un índice secundario de DynamoDB |
En la sección de la Guía para desarrolladores de DynamoDB en la que se analiza el método |
La Usar índices secundarios sección de esta guía proporciona más información. |
Operaciones de tabla
En esta sección se describen las operaciones APIs que difieren entre la versión 1 y la versión 2 en la mayoría de los casos de uso estándar.
En la versión 2, todas las operaciones que implican una sola tabla se invocan en la DynamoDbTable
instancia, no en el cliente mejorado. El cliente mejorado contiene métodos que pueden dirigirse a varias tablas.
En la tabla denominada Operaciones de tabla que aparece a continuación, se hace referencia a una POJO instancia como item
o como un tipo específico, por ejemplocustomer1
. En los ejemplos de la versión 2, la instancia nombrada table
es el resultado de una llamada anterior enhancedClient.table()
que devuelve una referencia a la DynamoDbTable
instancia.
Tenga en cuenta que la mayoría de las operaciones de la versión 2 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 versión 1, la tabla contiene algunos de los formularios más utilizados y no todos los formularios sobrecargados. Por ejemplo, el load()
método 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)
En la tabla se muestran los formularios más utilizados:
mapper.load(item) mapper.load(item, config)
Caso de uso | v1 | Funcionamiento de DynamoDB | v2 |
---|---|---|---|
Escribir un archivo Java en una POJO tabla de DynamoDB |
En la versión 1, |
PutItem , UpdateItem |
|
Leer un elemento de una tabla de DynamoDB a una tabla Java POJO |
|
GetItem |
|
Eliminar un elemento de una tabla de DynamoDB |
|
DeleteItem |
|
Consulte una tabla o índice secundario de DynamoDB y devuelva una lista paginada |
|
Query |
Utilice lo devuelto |
Consulte una tabla o índice secundario de DynamoDB y devuelva una lista |
|
Query |
Utilice lo devuelto |
Escanea una tabla o índice secundario de DynamoDB y devuelve una lista paginada |
|
Scan |
Utilice lo devuelto |
Escanea una tabla o índice secundario de DynamoDB y devuelve una lista |
|
Scan |
Utilice lo devuelto |
Lee varios elementos de varias tablas en un lote |
|
BatchGetItem |
|
Escribe varios elementos en varias tablas de un lote |
|
BatchWriteItem |
|
Elimine varios elementos de varias tablas en un lote |
|
BatchWriteItem |
|
Escribe o elimina varios elementos de un lote |
|
BatchWriteItem |
|
Realice una escritura transaccional |
|
TransactWriteItems |
|
Realice una lectura transaccional |
|
TransactGetItems |
|
Obtenga el recuento de los elementos coincidentes de un escaneo o consulta |
|
Query , Scan con Select.COUNT |
No compatible |
Cree una tabla en DynamoDB correspondiente a la clase POJO |
La instrucción anterior genera una solicitud de creación de tabla de bajo nivel; los usuarios deben llamar al cliente |
CreateTable |
|
Realice un escaneo paralelo en DynamoDB |
|
Scan con y parámetros Segment TotalSegments |
Los usuarios deben gestionar los hilos de trabajo y llamar
|
Integre Amazon S3 con DynamoDB para almacenar enlaces S3 inteligentes |
|
- |
No es compatible porque combina Amazon S3 y DynamoDB. |
Clases y propiedades del mapa
Tanto en la versión 1 como en la 2, las clases se asignan a las tablas mediante anotaciones tipo frijol. La versión 2 también ofrece otras formas de definir esquemas para casos de uso específicos, como trabajar con clases inmutables.
Anotaciones Bean
La siguiente tabla muestra las anotaciones bean equivalentes para un caso de uso específico que se utilizan en las versiones 1 y 2. Se utiliza un escenario de Customer
clase para ilustrar los parámetros.
Las anotaciones, así como las clases y las enumeraciones, de la versión 2 siguen la convención camel case y utilizan '', no 'DynamoDB'. DynamoDb
Caso de uso | v1 | v2 |
---|---|---|
Asigne una clase a una tabla |
|
El nombre de la tabla se define al llamar al DynamoDbEDnhancedClient#table() método. |
Designe un miembro de la clase como atributo de la tabla |
|
|
Designe un miembro de la clase como clave de hash o partición |
|
|
Designar un miembro de la clase es una clave de rango/clasificación |
|
|
Designe que un miembro de la clase es una clave de partición o hash de índice secundaria |
|
|
Designe un miembro de la clase como una clave de clasificación/rango de índice secundario |
|
|
Ignore este miembro de la clase al mapearlo a una tabla |
|
|
Designar un miembro de la clase como atributo UUID clave generado automáticamente |
|
La extensión que lo proporciona no se carga de forma predeterminada; debe agregarla al generador de clientes. |
Designe un miembro de la 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 generador de clientes. |
Designar un miembro de la clase como atributo de versión con incremento automático |
|
La extensión que proporciona esto se carga automáticamente. |
Designe a un miembro de la clase para que requiera una conversión personalizada |
|
|
Designe un miembro de la clase para almacenarlo como un tipo de atributo diferente |
|
Sin equivalente |
Designe una clase que se pueda serializar en un documento o subdocumento de DynamoDB JSON (estilo documento) |
|
Sin anotación equivalente directa. Utilice el documento API mejorado. |
V2: anotaciones adicionales
Caso de uso | v1 | v2 |
---|---|---|
Designe un miembro de la clase para que no se almacene como NULL atributo si el valor de Java es nulo | N/A |
|
Designe un miembro de la clase como objeto vacío si todos los atributos son nulos | N/A |
|
Designe una acción de actualización especial para un miembro de la clase | N/A |
|
Designe una clase inmutable | N/A |
|
Designe un miembro de la clase como atributo de contador que se incrementa automáticamente | N/A |
La extensión que proporciona esta funcionalidad se carga automáticamente. |
Configuración
En la versión 1, por lo general, se controlan comportamientos específicos mediante una instancia deDynamoDBMapperConfig
. Puede proporcionar el objeto de configuración al crear el mapeador o al realizar una solicitud. En la versión 2, la configuración es específica del objeto de solicitud de la operación.
Caso de uso | v1 | Predeterminado en la versión 1 | v2 |
---|---|---|---|
|
|||
Estrategia de reintento de carga por lotes |
|
Reintentar los elementos fallidos | |
Estrategia de reintento de escritura por lotes |
|
Reintentar los elementos fallidos | |
Lecturas consistentes |
|
EVENTUAL |
De forma predeterminada, las lecturas consistentes son falsas para las operaciones de lectura. Reemplace con .consistentRead(true) en el objeto de solicitud. |
Esquema de conversión con conjuntos de marshallers/unmarshallers |
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 anotaciones o adivina de la clase |
El nombre de la tabla se define al llamar al |
Estrategia de carga de paginación |
Las opciones son: LAZY _ |
LAZY_LOADING |
La iteración solo es la opción predeterminada. No se admiten las demás opciones de la versión 1. |
Solicita la recopilación de métricas |
|
null |
Úselo metricPublisher() ClientOverrideConfiguration al crear el cliente estándar de DynamoDB. |
Guarde el comportamiento |
Las opciones son |
UPDATE |
En la versión 2, se llama
|
fábrica de convertidores de tipos |
|
convertidores de tipo estándar |
Colóquelo en el frijol utilizando
|
Configuración previa a la operación
En la versión 1, algunas operaciones, por ejemploquery()
, 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 versión 2, en lugar de utilizar un objeto de configuración, se establecen los parámetros del 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 versión 2, las expresiones condicionales y de filtrado se expresan mediante un Expression
objeto, que encapsula la condición y la asignación de nombres y filtros.
Caso de uso | Operaciones | v1 | v2 |
---|---|---|---|
Condiciones de atributo esperadas | guardar (), eliminar (), consultar (), escanear () |
|
Obsoleto; utilícelo ConditionExpression en su lugar. |
Expresión de condición | eliminar () |
|
|
Expresión de filtro | consultar (), escanear () |
|
|
Expresión de condición para la consulta | consulta () |
|
|
Conversión de tipos
Convertidores predeterminados
En la versión 2, SDK proporciona un conjunto de convertidores predeterminados para todos los tipos comunes. Puede cambiar los convertidores de tipos tanto a nivel de proveedor general como para un único atributo. Puede encontrar una lista de los convertidores disponibles en la AttributeConverter
Configura un conversor personalizado para un atributo
En la versión 1, puede anotar un método de captación @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 una CurrencyFormatConverter
que convierta entre un Currency
tipo 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 versión 2 del fragmento anterior.
@DynamoDbConvertedBy(CurrencyFormatConverter.class)
public Currency getCurrency() { return currency; }
nota
En la versión 1, se puede aplicar la anotación al atributo en sí, a un tipo o a una anotación definida por el usuario. La versión 2 permite aplicar la anotación solo al captador.
Añada un conversor de tipos, fábrica o proveedor
En la versión 1, 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 se amplía DynamoDBTypeConverterFactory
y las anulaciones se realizan tomando una referencia al conjunto predeterminado y ampliándolo. En el siguiente fragmento 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 versión 2 proporciona una funcionalidad similar a través de la anotación@DynamoDbBean
. Puede proporcionar un único pedido AttributeConverterProvider
o una cadena de AttributeConverterProvider
s. 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 poder 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 de la versión 2.
Historial de documentos API
El documento API permite trabajar con documentos de JSON estilo como elementos individuales en una tabla de DynamoDB. El documento v1 API tiene una correspondiente API en la versión 2, pero en lugar de utilizar un cliente independiente para el documento API como en la versión 1, la versión 2 incorpora API funciones del documento en el cliente mejorado de DynamoDB.
En la versión 1, la Item
clase representa un registro no estructurado de una tabla de DynamoDB. En la versión 2, un registro no estructurado se representa mediante una instancia de la clase. EnhancedDocument
En la siguiente tabla se comparan las diferencias entre el documento APIs en la versión 1 y la versión 2.
Caso de uso | v1 | v2 |
---|---|---|
Cree un cliente de documentos |
|
|
Haga referencia a una tabla |
|
|
Work with semi-structured data | ||
Poner elemento |
|
|
Obtener elemento |
|
|
Work with JSON items | ||
Convierte una JSON estructura para utilizarla con el documento API |
|
|
Pon JSON |
|
|
Leer JSON |
|
|
APIreferencia y guías para el documento APIs
v1 | v2 | |
---|---|---|
APIreferencia | Javadoc | Javadoc |
Guía de documentación | Guía para desarrolladores de Amazon DynamoDB | Documento mejorado API (esta guía) |
FAQ
P: ¿El bloqueo optimista con un número de versión funciona de la misma manera en la versión 2 que en la versión 1?
R. El comportamiento es similar, pero la versión 2 no añade automáticamente condiciones para las operaciones de eliminación. Debe añadir las expresiones de condición manualmente si quiere controlar el comportamiento de eliminación.