

# Anotaciones de Java para DynamoDB
<a name="DynamoDBMapper.Annotations"></a>

En esta sección se describen las anotaciones que están disponibles para mapear las clases y las propiedades a las tablas y los atributos en Amazon DynamoDB.

Para obtener la documentación de Javadoc correspondiente, consulte [Annotation Types Summary (Resumen de tipos de anotaciones)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/package-summary.html) en la [Referencia de la API AWS SDK para Java](https://docs.aws.amazon.com/sdk-for-java/latest/reference/).

**nota**  
En las anotaciones siguientes, solo son obligatorias `DynamoDBTable` y `DynamoDBHashKey`. 

**Topics**
+ [DynamoDBAttribute](#DynamoDBMapper.Annotations.DynamoDBAttribute)
+ [DynamoDBAutoGeneratedKey](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey)
+ [DynamoDBAutoGeneratedTimestamp](#DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp)
+ [DynamoDBDocument](#DynamoDBMapper.Annotations.DynamoDBDocument)
+ [DynamoDBHashKey](#DynamoDBMapper.Annotations.DynamoDBHashKey)
+ [DynamoDBIgnore](#DynamoDBMapper.Annotations.DynamoDBIgnore)
+ [DynamoDBIndexHashKey](#DynamoDBMapper.Annotations.DynamoDBIndexHashKey)
+ [DynamoDBIndexRangeKey](#DynamoDBMapper.Annotations.DynamoDBIndexRangeKey)
+ [DynamoDBRangeKey](#DynamoDBMapper.Annotations.DynamoDBRangeKey)
+ [DynamoDBTable](#DynamoDBMapper.Annotations.DynamoDBTable)
+ [DynamoDBTypeConverted](#DynamoDBMapper.Annotations.DynamoDBTypeConverted)
+ [DynamoDBTyped](#DynamoDBMapper.Annotations.DynamoDBTyped)
+ [DynamoDBVersionAttribute](#DynamoDBMapper.Annotations.DynamoDBVersionAttribute)

## DynamoDBAttribute
<a name="DynamoDBMapper.Annotations.DynamoDBAttribute"></a>

Mapea una propiedad a un atributo de tabla. De forma predeterminada, cada propiedad de clase se mapea a un atributo de elemento con el mismo nombre. Sin embargo, si los nombres no son iguales, puede utilizar esta anotación para mapear una propiedad al atributo. En el siguiente fragmento de Java, `DynamoDBAttribute` mapea la propiedad `BookAuthors` al nombre de atributo `Authors` de la tabla.

```
@DynamoDBAttribute(attributeName = "Authors")
public List<String> getBookAuthors() { return BookAuthors; }
public void setBookAuthors(List<String> BookAuthors) { this.BookAuthors = BookAuthors; }
```

`DynamoDBMapper` utiliza `Authors` como nombre de atributo al guardar el objeto en la tabla. 

## DynamoDBAutoGeneratedKey
<a name="DynamoDBMapper.Annotations.DynamoDBAutoGeneratedKey"></a>

Marca una propiedad de clave de partición o de clave de ordenación como generada automáticamente. `DynamoDBMapper` genera un [UUID](http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html) aleatorio al guardar estos atributos. Solo se pueden marcar propiedades de tipo String como claves generadas automáticamente. 

El siguiente ejemplo muestra el uso de claves generadas automáticamente.

```
@DynamoDBTable(tableName="AutoGeneratedKeysExample")
public class AutoGeneratedKeys {
    private String id;
    private String payload;

    @DynamoDBHashKey(attributeName = "Id")
    @DynamoDBAutoGeneratedKey
    public String getId() { return id; }
    public void setId(String id) { this.id = id; }

    @DynamoDBAttribute(attributeName="payload")
    public String getPayload() { return this.payload; }
    public void setPayload(String payload) { this.payload = payload; }

    public static void saveItem() {
        AutoGeneratedKeys obj = new AutoGeneratedKeys();
        obj.setPayload("abc123");

        // id field is null at this point
        DynamoDBMapper mapper = new DynamoDBMapper(dynamoDBClient);
        mapper.save(obj);

        System.out.println("Object was saved with id " + obj.getId());
    }
}
```

## DynamoDBAutoGeneratedTimestamp
<a name="DynamoDBMapper.Annotations.DynamoDBAutoGeneratedTimestamp"></a>

Genera automáticamente una marca de tiempo.

```
@DynamoDBAutoGeneratedTimestamp(strategy=DynamoDBAutoGenerateStrategy.ALWAYS)
public Date getLastUpdatedDate() { return lastUpdatedDate; }
public void setLastUpdatedDate(Date lastUpdatedDate) { this.lastUpdatedDate = lastUpdatedDate; }
```

La estrategia de generación automática también puede definirse si se proporciona un atributo de estrategia. El valor predeterminado es `ALWAYS`.

## DynamoDBDocument
<a name="DynamoDBMapper.Annotations.DynamoDBDocument"></a>

Indica que una clase se puede serializar como un documento de Amazon DynamoDB.

Por ejemplo, supongamos que desea mapear un documento JSON a un atributo de DynamoDB de tipo Map (`M`). En el siguiente ejemplo de código se define un elemento que contiene un atributo anidado (Pictures) de tipo Map.

```
public class ProductCatalogItem {

    private Integer id;  //partition key
    private Pictures pictures;
    /* ...other attributes omitted... */

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id;}
    public void setId(Integer id) {this.id = id;}

    @DynamoDBAttribute(attributeName="Pictures")
    public Pictures getPictures() { return pictures;}
    public void setPictures(Pictures pictures) {this.pictures = pictures;}

    // Additional properties go here.

    @DynamoDBDocument
    public static class Pictures {
        private String frontView;
        private String rearView;
        private String sideView;

        @DynamoDBAttribute(attributeName = "FrontView")
        public String getFrontView() { return frontView; }
        public void setFrontView(String frontView) { this.frontView = frontView; }

        @DynamoDBAttribute(attributeName = "RearView")
        public String getRearView() { return rearView; }
        public void setRearView(String rearView) { this.rearView = rearView; }

        @DynamoDBAttribute(attributeName = "SideView")
        public String getSideView() { return sideView; }
        public void setSideView(String sideView) { this.sideView = sideView; }

     }
}
```

A continuación, podría guardar un nuevo elemento `ProductCatalog`, con `Pictures`, tal como se muestra en el siguiente ejemplo.

```
ProductCatalogItem item = new ProductCatalogItem();

Pictures pix = new Pictures();
pix.setFrontView("http://example.com/products/123_front.jpg");
pix.setRearView("http://example.com/products/123_rear.jpg");
pix.setSideView("http://example.com/products/123_left_side.jpg");
item.setPictures(pix);

item.setId(123);

mapper.save(item);
```

El elemento `ProductCatalog` resultante tendría este aspecto (en formato JSON).

```
{
  "Id" : 123
  "Pictures" : {
    "SideView" : "http://example.com/products/123_left_side.jpg",
    "RearView" : "http://example.com/products/123_rear.jpg",
    "FrontView" : "http://example.com/products/123_front.jpg"
  }
}
```

## DynamoDBHashKey
<a name="DynamoDBMapper.Annotations.DynamoDBHashKey"></a>

Mapea una propiedad de clase a la clave de partición de la tabla. La propiedad debe ser un escalar de tipo String, Number o Binary. La propiedad no puede ser un tipo de colección. 

Supongamos que tenemos una tabla, `ProductCatalog`, cuya clave principal es `Id`. En el siguiente código Java se define una clase `CatalogItem` y se mapea su propiedad `Id` a la clave principal de la tabla `ProductCatalog` utilizando la etiqueta `@DynamoDBHashKey`.

```
@DynamoDBTable(tableName="ProductCatalog")
public class CatalogItem {
    private Integer Id;
   @DynamoDBHashKey(attributeName="Id")
   public Integer getId() {
        return Id;
   }
   public void setId(Integer Id) {
        this.Id = Id;
   }
   // Additional properties go here.
}
```

## DynamoDBIgnore
<a name="DynamoDBMapper.Annotations.DynamoDBIgnore"></a>

Indica a la instancia `DynamoDBMapper` que la propiedad asociada debe pasarse por alto. Al guardar datos en la tabla, `DynamoDBMapper` no guarda esta propiedad en la tabla.

 Se aplica al método getter o al campo de clase de una propiedad sin modelar. Si la anotación se aplica directamente al campo de clase, los métodos getter y setter correspondientes deben declararse en la misma clase. 

## DynamoDBIndexHashKey
<a name="DynamoDBMapper.Annotations.DynamoDBIndexHashKey"></a>

Mapea una propiedad de clase a la clave de partición de un índice secundario global. La propiedad debe ser un escalar de tipo String, Number o Binary. La propiedad no puede ser un tipo de colección. 

Use esta anotación si necesita `Query` un índice secundario global. Debe especificar el nombre de índice (`globalSecondaryIndexName`). Si el nombre de la propiedad de clase es distinto de la clave de partición del índice, también deberá especificar el nombre de ese atributo de índice (`attributeName`).

## DynamoDBIndexRangeKey
<a name="DynamoDBMapper.Annotations.DynamoDBIndexRangeKey"></a>

Mapea una propiedad de clase a la clave de ordenación de un índice secundario global o un índice secundario local. La propiedad debe ser un escalar de tipo String, Number o Binary. La propiedad no puede ser un tipo de colección. 

Use esta anotación si tiene que utilizar una operación `Query` en un índice secundario local o un índice secundario global y desea refinar los resultados mediante la clave de ordenación del índice. Debe especificar el nombre de índice (`globalSecondaryIndexName` o `localSecondaryIndexName`). Si el nombre de la propiedad de clase es distinto de la clave de ordenación del índice, también deberá especificar el nombre de ese atributo de índice (`attributeName`).

## DynamoDBRangeKey
<a name="DynamoDBMapper.Annotations.DynamoDBRangeKey"></a>

Mapea una propiedad de clase a la clave de ordenación de la tabla. La propiedad debe ser un escalar de tipo String, Number o Binary. No puede ser un tipo de colección. 

Si la clave principal es compuesta (clave de partición y clave de ordenación), puede utilizar esta etiqueta para mapear el campo de clase a la clave de ordenación. Por ejemplo, supongamos que tenemos una tabla `Reply` en la que se almacenan las respuestas de las conversaciones de un foro. Cada conversación puede tener muchas respuestas. La clave principal de esta tabla consta de `ThreadId` y `ReplyDateTime`. `ThreadId` es la clave de partición y `ReplyDateTime` es la de orden. 

En el siguiente código Java se define una clase `Reply` y se mapea a la tabla `Reply`. Se utilizan las etiquetas `@DynamoDBHashKey` y `@DynamoDBRangeKey` para identificar las propiedades de clase mapeadas a la clave principal.

```
@DynamoDBTable(tableName="Reply")
public class Reply {
    private Integer id;
    private String replyDateTime;

    @DynamoDBHashKey(attributeName="Id")
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @DynamoDBRangeKey(attributeName="ReplyDateTime")
    public String getReplyDateTime() { return replyDateTime; }
    public void setReplyDateTime(String replyDateTime) { this.replyDateTime = replyDateTime; }

   // Additional properties go here.
}
```

## DynamoDBTable
<a name="DynamoDBMapper.Annotations.DynamoDBTable"></a>

Identifica la tabla de destino de DynamoDB. Por ejemplo, en el siguiente código Java se define una clase `Developer` y se mapea a la tabla `People` en DynamoDB. 

```
@DynamoDBTable(tableName="People")
public class Developer { ...}
```

La anotación `@DynamoDBTable` se puede heredar. Cualquier nueva clase que herede de la clase `Developer` también se mapea a la tabla `People`. Por ejemplo, supongamos que hemos creado una clase `Lead` que hereda de la clase `Developer`. Dado que ha mapeado la clase `Developer` a la tabla `People`, los objetos de la clase `Lead` también se almacenan en la misma tabla.

La anotación `@DynamoDBTable` también se puede anular. Cualquier nueva clase que herede de la clase `Developer` de forma predeterminada se mapea a la misma tabla `People`. Sin embargo, puede anular este mapeo predeterminado. Por ejemplo, si crea una clase que hereda de la clase `Developer`, puede mapearla explícitamente a otra tabla agregando la anotación `@DynamoDBTable`, como se muestra en el siguiente ejemplo de código Java.

```
@DynamoDBTable(tableName="Managers")
public class Manager extends Developer { ...}
```

## DynamoDBTypeConverted
<a name="DynamoDBMapper.Annotations.DynamoDBTypeConverted"></a>

Anotación para marcar que una propiedad usa un convertidor de tipos personalizado. Se puede usar una anotación definida por el usuario para pasar propiedades adicionales al convertidor `DynamoDBTypeConverter`. 

 La interfaz `DynamoDBTypeConverter` permite mapear sus propios tipos de datos arbitrarios a un tipo de datos que sea compatible de forma nativa con DynamoDB. Para obtener más información, consulte [Asignación de datos arbitrarios en DynamoDB](DynamoDBMapper.ArbitraryDataMapping.md).

## DynamoDBTyped
<a name="DynamoDBMapper.Annotations.DynamoDBTyped"></a>

Anotación para anular el vínculo de tipo de atributo estándar. Los tipos estándar no requieren la anotación si se les aplica el vínculo de atributo predeterminado para ese tipo. 

## DynamoDBVersionAttribute
<a name="DynamoDBMapper.Annotations.DynamoDBVersionAttribute"></a>

Identifica una propiedad de clase para almacenar un número de versión de bloqueo optimista. `DynamoDBMapper` asigna un número de versión a esta propiedad cuando guarda un elemento nuevo e incrementa su valor cada vez que se actualiza el elemento. Solo se admiten escalares de tipo Number. Para obtener más información sobre los tipos de datos de , consulte [Tipos de datos](HowItWorks.NamingRulesDataTypes.md#HowItWorks.DataTypes). Para obtener más información sobre el control de versiones, consulte [DynamoDB y bloqueo positivo con el número de versión](DynamoDBMapper.OptimisticLocking.md).