Database 尝试使用DynamoDBMapper时出现异常:哈希键没有映射
我有一个带有主键(id:integer)和辅助键(dateTo:String)的DynamoDB表。我制作了一个利用DynamoDBMapper的类:Database 尝试使用DynamoDBMapper时出现异常:哈希键没有映射,database,hash,nosql,amazon-dynamodb,primary-key,Database,Hash,Nosql,Amazon Dynamodb,Primary Key,我有一个带有主键(id:integer)和辅助键(dateTo:String)的DynamoDB表。我制作了一个利用DynamoDBMapper的类: @DynamoDBTable(tableName="MyItems" public class MyItemsMapper { private int id; private String dateTo; private String name; @DynamoDBHashKey(attributeName="i
@DynamoDBTable(tableName="MyItems"
public class MyItemsMapper {
private int id;
private String dateTo;
private String name;
@DynamoDBHashKey(attributeName="id")
public void setId(int id) { this.id = id; }
public int getId() { return id; }
@DynamoDBAttribute(attributeName="dateTo")
public void setDateTo(String dateTo) { this.dateTo = dateTo; }
public String getDateTo() { return dateTo; }
@DynamoDBAttribute(attributeName="name")
public void setName(String name { this.name = name; }
public String getName() { return name; }
public boolean saveItem(MyItemsMapper item) {
try {
DynamoDBMapper mapper = new DynamoDBMapper(client); //<-- This connects to the DB. This works fine.
item.setId(generateUniqueNumber()); //<-- This generates a unique integer. Also seems to work fine.
mapper.save(item);
logger.info("Successfully saved item. See info below.");
logger.info(item.toString());
return true;
} catch (Exception e) {
logger.error("Exception while trying to save item: " + e.getMessage());
e.printStackTrace();
return false;
}
}
}
我正在JUnit测试中运行manager类:
public class MyManagerTest {
@Test
public void saveNewItemTest() {
MyManager myManager = new MyManager();
myManager.recordItem(1234567, "2018-01-01", "Anthony");
}
}
当我通过我的管理器运行JUnit测试来使用上面的saveItem
方法时,我得到以下错误:
com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMappingException: MyItemsMapper; no mapping for HASH key
我不确定它与什么有关,因为我的表肯定有一个主键,而我的次键也总是有一个值
我怎样才能让它工作
更多信息:
值得注意的是,我可以通过项对象
将数据记录到DynamoDB表中。如果我执行以下操作,我的数据将记录到数据库中:
DynamoDB dynamoDB = new DynamoDBClient().connectToDynamoDB(); //<--
Connection. Works fine.
Table table = dynamoDB.getTable("MyItems");
item.withPrimaryKey("id", 1234567);
item.withString("dateTo", "2018-01-01");
item.withString("name", "Anthony");
PutItemOutcome outcome = table.putItem(item);
DynamoDB DynamoDB=new DynamoDBClient().connectToDynamoDB()// 我不确定这是否是导致问题的原因,但您正在创建myItemsMapper对象,然后将对此对象的引用传递给自身
我建议删除您的saveItem方法。MyItemsMapper类应该是一个普通的旧java对象。那就让我的经理这样吧
public class MyManager {
public boolean recordItem(
int id,
String dateTo,
String name,
) {
MyItemsMapper myItemsMapper = new MyItemsMapper();
myItemsMapper.setId(id);
myItemsMapper.setDateTo(dateTo);
myItemsMapper.setName(name);
DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(myItemsMapper);
}
}
public boolean saveItem() {
try {
DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(this);
logger.info("Successfully saved item. See info below.");
logger.info(this.toString());
return true;
} catch (Exception e) {
logger.error("Exception while trying to save item: " + e.getMessage());
e.printStackTrace();
return false;
}
}
如果您特别想保留saveItem方法,请这样做
public class MyManager {
public boolean recordItem(
int id,
String dateTo,
String name,
) {
MyItemsMapper myItemsMapper = new MyItemsMapper();
myItemsMapper.setId(id);
myItemsMapper.setDateTo(dateTo);
myItemsMapper.setName(name);
DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(myItemsMapper);
}
}
public boolean saveItem() {
try {
DynamoDBMapper mapper = new DynamoDBMapper(client);
mapper.save(this);
logger.info("Successfully saved item. See info below.");
logger.info(this.toString());
return true;
} catch (Exception e) {
logger.error("Exception while trying to save item: " + e.getMessage());
e.printStackTrace();
return false;
}
}
然后在我的经理那里呢
MyItemsMapper myItemsMapper = new MyItemsMapper();
myItemsMapper.setId(id);
myItemsMapper.setDateTo(dateTo);
myItemsMapper.setName(name);
myItemsMapper.saveItem();
我不太确定你想在这段代码中实现什么。您有一种称为MyItemsMapper的映射对象,但它似乎没有被使用。你能描述一下你的方法吗?您传入一个VendorAlertsMapper对象并保存它,因此我们需要查看该代码以了解其失败的原因。@Stu用更多代码和信息更新了原始帖子。VendorAlertsMapper
应该是MyItemsMapper
。您能确认分区键的数据类型吗?进入Dynamo控制台,在Tables视图中有一个包含列名称、状态、分区键的表。。。您可以从分区键复制值吗?例如,我有一个带有“userId(String)”的表