我有一个扩展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);
}
答案 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}}可用于更新特定密钥的少数属性