Версия Dynamodb с DynamoD Mapper не работает должным образом - PullRequest
0 голосов
/ 01 января 2019

Я получаю исключение условной проверки при попытке сохранить / обновить элементы с помощью динамического преобразователя.

Может ли кто-нибудь поделиться фрагментом кода с использованием java, который может продемонстрировать, как можно успешно реализовать управление версиями и оптимистическую блокировку?

Попробовал вообще не устанавливать версию !!Попытался добавить запись в таблицу, а затем выполнить чтение перед сохранением.

Ничего не проснулось !!Я продолжаю получать ConditionalCheckFailed Exception.Единственное, что работает, если я установил конфиг на 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);
}

Пожалуйста, проверьте фрагмент выше - это новая пустая таблица.hashkey - id, rangekey - auditId, VersionField - version.

Я просто хочу иметь возможность добавить новую запись, поэтому не делаю чтения перед сохранением нового элемента.Если я смогу получить этот простой случай, то есть добавить новую / первую запись в работу таблицы Dynamodb, я смогу реализовать и остальные варианты использования.

1 Ответ

0 голосов
/ 01 января 2019

В общем:

  1. Никогда не устанавливайте свою версию, SDK будет инициализировать это при необходимости.
  2. Всегда сначала пытайтесь загрузить предмет ключом.Если возвращается значение null, создайте элемент и сохраните его.В противном случае обновите возвращенный товар и сохраните его.

Я знаю, что вы упомянули, что пробовали выше.Если это действительно пустая таблица, ваш код должен работать нормально (за исключением настройки версии).

Несколько вещей, которые я бы также сделал:

  • Не устанавливайте свою версиюполе с именем настраиваемого атрибута.Теоретически это должно быть хорошо, но ради того, чтобы сделать ваш код таким же, как примеры AWS, я бы удалил это, по крайней мере, пока он не заработает.
  • Хотя я думаю, что вам нужно удалить настройкуверсии, я отмечаю, что вы используете длинную, а не длинную.Опять же, вряд ли это будет проблемой, но просто что-то, чтобы устранить по крайней мере.т.е. если вы настаиваете на настройке версии, используйте новую Long (l).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...