2016-07-15 58 views
0

我想在DynamoDB中爲我的對象實現更改歷史記錄。簡單的做法是將「對象ID」指定爲散列值,將「更新時間」指定爲範圍鍵。但是,java sdk不允許註釋鍵始終自動生成(如果沒有註釋便利性,更改值似乎工作正常)。爲什麼?爲什麼DynamoDB java sdk不允許始終自動生成密鑰?

示例代碼:

@DynamoDBTable(tableName = "data") 
public class Person { 

    public static void main(String[] args) { 
     AmazonDynamoDBClient client = new AmazonDynamoDBClient() 
       .withEndpoint("http://localhost:8000"); 
     DynamoDBMapper mapper = new DynamoDBMapper(client); 

     TableUtils.deleteTableIfExists(client, mapper.generateDeleteTableRequest(Person.class)); 
     TableUtils.createTableIfNotExists(client, mapper.generateCreateTableRequest(Person.class) 
       .withProvisionedThroughput(new ProvisionedThroughput(1L, 1L)) 
     ); 

     Person person = new Person(); 
     person.setPersonId("abc"); 

     mapper.save(person); 
     mapper.save(person); 

     TableUtils.deleteTableIfExists(client, mapper.generateDeleteTableRequest(Person.class)); 
    } 

    @DynamoDBHashKey 
    private String personId; 

    @DynamoDBRangeKey 
    @DynamoDBAutoGeneratedTimestamp 
    private Long updated; 

    public String getPersonId() { 
     return personId; 
    } 

    public void setPersonId(String personId) { 
     this.personId = personId; 
    } 

    public Long getUpdated() { 
     return updated; 
    } 

    public void setUpdated(Long updated) { 
     this.updated = updated; 
    } 
} 

例外:

Exception in thread "main" com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: Field com.dynamodb.testpackage.Person[updated] must not have auto-generated key with ALWAYS strategy 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapperFieldModel$Builder.build(DynamoDBMapperFieldModel.java:797) 
    at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$SchemaFactory.newTableModel(StandardModelFactories.java:118) 
    at com.amazonaws.services.dynamodbv2.datamodeling.StandardModelFactories$SchemaFactory.getTableModel(StandardModelFactories.java:86) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.getTableModel(DynamoDBMapper.java:401) 
    at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.generateCreateTableRequest(DynamoDBMapper.java:2432) 
    at com.dynamodb.testpackage.Person.main(Person.java:21) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:497) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 

回答

0

你的用例是典型的。通常你不希望對象的散列和範圍鍵發生改變。事實上,我會盡可能說它不鼓勵。

事實上,使用DynamoDB時,項目的唯一特徵是它的關鍵(無論是分區鍵還是分區+範圍鍵),所以更改範圍鍵本質上會創建一個新的項目,這在技術上不是更新。

我不知道這是否準確代表之所以混合@DynamoDBAutoGeneratedTimestamp@DynamoDBRangeKey沒有在SDK的支持,但它肯定是有原因的。