Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 尝试使用DynamoDBMapper时出现异常:哈希键没有映射_Database_Hash_Nosql_Amazon Dynamodb_Primary Key - Fatal编程技术网

Database 尝试使用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

我有一个带有主键(id:integer)和辅助键(dateTo:String)的DynamoDB表。我制作了一个利用DynamoDBMapper的类:

@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)”的表