CRUD存储库:覆盖保存到实现存在

时间:2016-10-30 21:54:44

标签: java amazon-dynamodb crud

我有一个扩展CrudRepository的接口,每次使用已存在的密钥保存对象时,它都会用新的对象覆盖现有对象。如何覆盖save以便检查具有该密钥的对象是否已存在?

我已经尝试了以下内容,但它无效:

public interface CustomRepo {

    public Channel save(Channel channel);

}


public class RepositoryImpl implements CustomRepo {

    @Autowired
    private DynamoDBMapper  mapper;

    public Channel save(Channel channel){
        channel.setId(UUID.randomUUID().toString());
        DynamoDBSaveExpression saveExpression = new DynamoDBSaveExpression();
        Map<String, ExpectedAttributeValue> expectedAttributes = 
                ImmutableMap.<String, ExpectedAttributeValue>builder()
                    .put(channel.getUrl(), new ExpectedAttributeValue(false))
                    .put(channel.getTitle(), new ExpectedAttributeValue(false))
                    .build();
        saveExpression.setExpected(expectedAttributes);
        saveExpression.setConditionalOperator(ConditionalOperator.AND);

        try {
            mapper.save(channel, saveExpression);
        } catch (ConditionalCheckFailedException e) {
            System.err.println("Item with URL {} already exists. Cannot overrwrite."+ channel.getUrl());
            System.err.println(e.getMessage());
        }
        return channel;

    }

public interface ChannelRepository extends CrudRepository<Channel, String>, CustomRepo {
    @EnableScan
    List<Channel> findByTitle(String title);

    @Override
    @EnableScan
    List<Channel> findAll();

    List<Channel> findByUrl(String url);

}

1 个答案:

答案 0 :(得分:0)

问题:我将问题陈述理解为&#34;所有现有的非关键属性都替换为新值&#34;而不是您尝试更新的URL和TITLE属性。

有两种方法可以在不覆盖save()方法的情况下解决此问题。

1)可以适当设置SaveBehavior以相应地更新属性。在您的代码中,您使用了默认的UPDATE保存行为。您可以使用UPDATE_SKIP_NULL_ATTRIBUTES保存行为,这样它就不会更新模型对象中的NULL属性(在您的情况下,它是通道)。

您还可以查看APPEND_SET,这是SET数据类型UPDATE_SKIP_NULL_ATTRIBUTES的进一步扩展。

示例代码: -

DynamoDBMapperConfig dynamoDBMapperConfig = new DynamoDBMapperConfig(SaveBehavior.UPDATE_SKIP_NULL_ATTRIBUTES);     
DynamoDBMapper dynamoDBMapper = new DynamoDBMapper(dynamoDBClient, dynamoDBMapperConfig);
dynamoDBMapper.save(order);
  

UPDATE(默认值):UPDATE不会影响a上的未建模属性   保存操作,建模属性的空值将被删除   它来自DynamoDB中的那个项目。由于updateItem的限制   请求,UPDATE的执行时会发送一个putItem请求   正在保存一个仅限密钥的对象,它将发送另一个updateItem   请求表中是否已存在给定的密钥。

     

APPEND_SET将标量属性(String,Number,Binary)视为相同   如UPDATE_SKIP_NULL_ATTRIBUTES那样。但是,对于set属性,它   将附加到现有属性值,而不是覆盖它。   调用者需要确保建模的属性类型与   现有的集合类型,否则会导致服务异常。

     

UPDATE_SKIP_NULL_ATTRIBUTES类似于UPDATE,除了它   忽略任何空值属性,并且不会从中删除它们   DynamoDB中的项目。它还保证只发送一个单一的   updateItem请求,无论对象是否为key-only。

DynamoDBMapperConfig SaveBehavior

2)带有UpdateItemSpec的{​​{1}}可用于更新特定密钥的少数属性

UpdateItemSpec Example