2016-05-09 3 views
2

Я только начинаю свой первый проект DynamoDB, и я старался как можно больше прочитать документацию. Я считаю, что наилучшей возможностью для моего проекта является использование DynamoDbMapper High Level в SDK для выполнения операций CRUD.Java DynamoDBMapper. Отображение значения атрибута 'M'

В документации DynamoDB есть тип значения атрибута «M», который можно увидеть здесь http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_AttributeValue.html

В нижней Java API уровня, такие как GetItem или getItemBatch, этот тип значение преобразуется в Java. util.map <>.

Но я не могу найти какие-либо ресурсы, которые говорят, что я могу использовать более высокий уровень DBMapper для использования этого типа данных. Поддерживаемые типы данных. http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DynamoDBMapper.DataTypes.html

Я заметил в нижней части страницы, что дает некоторое представление о создании собственной системы отображения более высокого уровня. Но я подумал, что сначала попрошу об этом, прежде чем я попаду в код, чтобы попробовать это. Поэтому я предполагаю, что мой вопрос: есть ли в любом случае использование DynamoDBMapper для работы с типом данных Java.Util.Map?

Единственная проницательность, которую я мог найти в google, - это странная ошибка github, где пользователь, похоже, делает именно то, что я хочу сделать. https://github.com/aws/aws-sdk-java/issues/520

Надеюсь, что это имеет смысл. Ральф

+0

Вы когда-нибудь это выясняли? – BinaryShrub

ответ

1

UPDATE: Замечено, что вам нужно отобразить java.util.Map свойство в атрибут карты DynamoDB, поэтому все, что ниже не отвечает на вопрос, извините. В моем случае используется свойство пользовательского класса, а не свойство класса Java.Util.Map.


Предположим, что ваша таблица имеет название "my_table", и предположим, что следующее является JSON свалка записи:

{ 
    uuid: "52f9d257-7998-4379-928b-9d41d70dd8a8", 
    my_map: { 
    field1: 123, 
    field2: 456 
    } 
} 

(Здесь my_map является искомым полем типа 'M')

чтобы использовать DynamoDBMapper для такой таблицы вы должны создать два аннотированных классов, первый для самой таблицы:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable; 

@DynamoDBTable(tableName="my_table") 
public class MyClass { 
    private String uuid; 
    private MyMapClass myMap; 

    @DynamoDBHashKey(attributeName="uuid") 
    public String getUuid() { 
     return uuid; 
    } 
    public void setUuid(String uuid) { 
     this.uuid = uuid; 
    } 

    @DynamoDBAttribute(attributeName = "my_map")  
    public MyMapClass getMyMap() { 
     return myMap; 
    } 
    public void setMyMap(MyMapClass myMap) { 
     this.myMap = myMap; 
    }  
} 

и второй - для поля my_map:

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute; 
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBDocument; 


@DynamoDBDocument 
public class MyMapClass { 
    private int field1; 
    private int field2; 

    @DynamoDBAttribute(attributeName = "field1")  
    public int getField1() { 
     return field1; 
    } 
    public void setField1(int field1) { 
     this.field1 = field1; 
    } 

    @DynamoDBAttribute(attributeName = "field2")  
    public int getField2() { 
     return field2; 
    } 
    public void setField2(int field2) { 
     this.field2 = field2; 
    } 
} 

Вот пример использования:

... 
DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient); 
... 
MyClass item = new MyClass(); 
item.setUuid("52f9d257-7998-4379-928b-9d41d70dd8a8"); 
MyMapClass map = new MyMapClass(); 
map.setField1(123); 
map.setField2(456); 
item.setMyMap(map); 
dbMapper.save(item); 

Надеется, что это помогает!

0

Немного старого сообщения, но я думаю, что стоит ответить на мой опыт здесь. Что я заметил с помощью карты DynamoDB, так это то, что она поддерживает карту со строкой в ​​качестве ключа. Так что если у вас есть Карта, он должен работать (с конверсионной схемы как ConversionSchemas.V2, как описано here (в основном создать DynamoDB картографа, как показано ниже -

DynamoDBMapper dbMapper = new DynamoDBMapper(dbClient, DynamoDBMapperConfig.DEFAULT); 

Теперь стоимость часть этой карты должна быть поддерживаемым dynamoDB типа данных также означает, что он может иметь числа, строки и т. д.

Если у вас нет ключа (или/и значения) в качестве строки, вам необходимо написать свои собственные конвертеры. Вот пример моего конвертера, который я использовал для LocalDate с использованием Map as key.

public class LocalDateMapConverter implements DynamoDBTypeConverter< Map<String, Long>, Map<LocalDate, Long>> { 
@Override 
public Map<String, Long> convert(Map<LocalDate, Long> localDateToStringMap) { 
    return localDateToStringMap.entrySet() 
      .stream() 
      .collect(toMap(k -> k.getKey().toString(), 
        Map.Entry::getValue)); 
} 

@Override 
public Map<LocalDate, Long> unconvert(Map<String, Long> stringToLocalDateMap) { 
    return stringToLocalDateMap.entrySet() 
      .stream() 
      .collect(toMap(k -> LocalDate.parse(k.getKey()), 
        Map.Entry::getValue)); 
} 
} 



@DynamoDBTable(tableName = "someTable") 
public class SomeTable { 

@DynamoDBHashKey(attributeName = "someKey") 
    private String key; 

@DynamoDBAttribute(attributeName = "someMapName") 
    @DynamoDBTypeConverted(converter = LocalDateMapConverter.class) 
    private Map<LocalDate, Long> someMap; 

} 

Надеюсь, что это поможет.

Смежные вопросы