When writing a DynamoDB Java App you can receive the 'no mapping for HASH key' error when writing or retrieving from a table if the table and its data model are not configured correctly. The full exception would be similar to:
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: <YourClassNameHere>; no mapping for HASH key
Make sure that your annotated mapped class's getters are declared public
.
Two helpful things to check here:
1) For your main setter for your hash key value make sure that the @DynamoDBHashKey
notation is correctly set. @DynamoDBAttribute
is NOT the correct one to use for your table's main hash key and neither is @DynamoDBIndexHashKey
.
2) Make sure that the hash key is defined in the table definition:
CreateTableRequest createTableRequest = new CreateTableRequest()
.withTableName("testtable")
.withKeySchema(
new KeySchemaElement("id", KeyType.HASH)
)
.withProvisionedThroughput(new ProvisionedThroughput(1L, 1L))
.withAttributeDefinitions(
new AttributeDefinition("id", "S")
);
CreateTableResult result = amazonDynamoDB.createTable(createTableRequest);
The above table definition creates a table 'testtable' with a main index or hash key variable titled id
and the type is S
for string.
Additionally, if you are using inheritance, make sure that you don't have two functions with the same name that override each other. Dynamo will use the top-level getter and this can cause issues.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With