使用dynamodb映射器的dynamodb versioing无法正常工作

时间:2018-12-31 22:51:52

标签: java amazon-dynamodb

当我尝试使用dynamodb映射器保存/更新项目时,出现了conditionalcheckfailed异常。

任何人都可以使用Java共享代码片段,以演示如何成功实现版本控制和乐观锁定吗?

试图完全不设置版本! 尝试将记录添加到表中,然后在保存之前进行读取。

什么都没醒!我继续收到ConditionalCheckFailed异常。 唯一有效的方法是将配置设置为COBBLER!但这不是我想要的,因为我需要对数据进行乐观锁定。

数据库项目类---

@DynamoDBTable(tableName="Funds")
public class FundsItem {
    private String id;
    private String auditId;
    private Long version;
    private String shopId;
    private String terminalId;
    private String txId;

    @DynamoDBHashKey(attributeName = "Id")
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    @DynamoDBRangeKey(attributeName = "AuditId")
    public String getAuditId() {
        return auditId;
    }
    public void setAuditId(String auditId) {
        this.auditId = auditId;
    }

    @DynamoDBVersionAttribute(attributeName = "Version")
    public Long getVersion() { return version; }
    public void setVersion(Long version) { this.version = version; }


    @DynamoDBAttribute(attributeName = "ShopId")
    public String getShopId() {
        return shopId;
    }
    public void setShopId(String shopId) {
        this.shopId = shopId;
    }

    @DynamoDBAttribute(attributeName = "TerminalId")
    public String getTerminalId() { return terminalId; }
    public void setTerminalId(String terminalId) {
        this.terminalId = terminalId;
    }

    @DynamoDBAttribute(attributeName = "TxId")
    public String getTxId() {
        return txId;
    }
    public void setTxId(String txId) {
        this.txId = txId;
    }

   }

保存新项目的代码-----

public long addFunds(FundsRequest request){

  FundsItem dbItem = new FundsItem();

  String Id = request.getShopId().trim() + request.getTerminalId().trim();
  String V0_Audit_Rec = "V0_Audit_" + Id;


        //save V0 item.
        dbItem.setVersion((long) 1);
        dbItem.setId(Id);
        dbItem.setAuditId(V0_Audit_Rec);
        dbItem.setShopId(request.getShopId().trim());
        dbItem.setTerminalId(request.getTerminalId().trim());
        dbItem.setTxId(request.getTxId().trim());

        mapper.save(dbItem);
}

请检查上面的代码段-这是一个新的空表。 哈希键-id,范围键-auditId,VersionField-版本。

我只想能够添加一条新记录,这就是为什么在保存新项目之前不进行任何读取。如果我能得到这个简单的案例,即向dynamodb表工作中添加一个新的/ first记录,那么我也可以实现其余用例。

1 个答案:

答案 0 :(得分:0)

通常:

  1. 从不设置您的版本,如果需要,SDK会对此进行初始化。
  2. 始终尝试先用钥匙装载物品。如果返回null,则创建项目并保存。否则更新返回的项目并保存。

我知道您提到您已经尝试了上述方法。如果它确实是一个空表,则您的代码应该可以正常工作(减去版本的设置)。

我也会做几件事:

  • 请勿使用自定义属性名称设置版本字段。从理论上讲,这应该没问题,但是为了使您的代码与AWS示例相同,我会删除它,至少要等到它起作用为止。
  • 尽管我认为您需要删除版本的设置,但我注意到您正在转换为long类型,而不是long类型。同样,这不太可能成为问题,但至少可以消除一些问题。即,如果您坚持设置版本,请使用新的Long(l)。