【问题标题】:Conditional update in Dynamo Db using mapper使用映射器在 Dynamo Db 中进行条件更新
【发布时间】:2017-04-16 15:29:00
【问题描述】:

我正在尝试根据要更新的分数大于当前分数的条件对表中的字段分数进行条件更新。

我写了以下代码,

StudentDO temp = mapper.load(StudentDO.class, student.getId());
temp.setScore(marks);
ArrayList<AttributeValue> list = new ArrayList<AttributeValue>();
            list.add(new AttributeValue().withN(Oldmarks.toString()));

            Map<String,ExpectedAttributeValue> expectedAttributes = new 
                                                                                                                   HashMap<String,ExpectedAttributeValue>();

            ExpectedAttributeValue expectedAttributeValue = new 
                                                                                                     ExpectedAttributeValue().withAttributeValueList(list)
                                                                                                                                       .withComparisonOperator("GT");

            expectedAttributes.put("Score",expectedAttributeValue);
            mapper.save(temp, new DynamoDBSaveExpression().withExpected(expectedAttributes));

运行时异常导致失败

com.amazonaws.services.dynamodbv2.model.ConditionalCheckFailedException:条件请求失败(服务:null;状态代码:400;错误代码:ConditionalCheckFailedException;请求 ID:null)

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.amazonaws.services.dynamodbv2.local.embedded.DDBExceptionMappingInvocationHandler.handleDynamoDBLocalServiceException(DDBExceptionMappingInvocationHandler.java:87)
at com.amazonaws.services.dynamodbv2.local.embedded.DDBExceptionMappingInvocationHandler.invoke(DDBExceptionMappingInvocationHandler.java:66)
at com.sun.proxy.$Proxy19.updateItem(Unknown Source)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.doUpdateItem(DynamoDBMapper.java:854)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$2.executeLowLevelRequest(DynamoDBMapper.java:594)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper$SaveObjectHandler.execute(DynamoDBMapper.java:733)
at com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper.save(DynamoDBMapper.java:623)
at com.amazonaws.services.dynamodbv2.datamodeling.AbstractDynamoDBMapper.save(AbstractDynamoDBMapper.java:128)

我无法调试为什么会抛出条件检查失败异常。 我可以确定请求格式不正确,但不确定它在哪里格式错误?

我已尝试将其与这些文档对齐 http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBSaveExpression.html

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/ExpectedAttributeValue.html

http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/model/AttributeValue.html

我的数据库架构是这样的

@DynamoDBTable(tableName = "Student")

public class StudentDO {
    @DynamoDBHashKey(attributeName = "Id")
    private Integer id;

    @DynamoDBAttribute(attributeName = "Name")
    private String name;

    @DynamoDBAttribute(attributeName = "Score")
    private Integer score;

    @Override
    public String toString() {

        return "Student [Name=" + name + ", id=" + id + ", score=" + score + "]";
    }


}

【问题讨论】:

  • 您能否提供一些有关您的 Dynamo 架构的详细信息?
  • 更新了相关架构

标签: java amazon-dynamodb


【解决方案1】:

每个 DynamoDB 属性都必须有一个公共 getter 和 setter,因为 DynamoDBMapper 在 JavaBeans 上工作(一个没有参数构造函数的类,每个私有 var 都有 getter + setter)。修改你的类:

@DynamoDBTable(tableName = "Student")
public class StudentDO {
    private Integer id;
    private String name;
    private Integer score;

    @DynamoDBAttribute(attributeName = "Id")
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @DynamoDBAttribute(attributeName = "Name")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @DynamoDBAttribute(attributeName = "Score")
    public Integer getScore() {
        return score;
    }

    public void setScore(Integer score) {
        this.score = score;
    }

    @Override
    public String toString() {

        return "Student [Name=" + name + ", id=" + id + ", score=" + score + "]";

    }
}

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2015-12-05
    • 2021-12-08
    • 2016-02-15
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    相关资源
    最近更新 更多