2016-10-30 43 views
0

我有一個擴展CrudRepository的接口,並且每次使用已存在的鍵保存對象時,它都會用新的鍵覆蓋現有對象。我如何覆蓋save,以便它檢查具有該密鑰的對象是否已經存在?CRUD儲存庫:覆蓋保存到實現存在

我已經嘗試以下,但它沒有工作:

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

問題:我明白問題的陳述爲「所有現有的非關鍵屬性被替換爲新的價值」,而不是您嘗試更新的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(默認):更新不會影響未建模屬性上 保存操作和建模屬性爲空值將從該項目中刪除 它在DynamoDB中。由於updateItem 請求的限制,當 僅保存一個僅保留鍵的對象時,UPDATE的實現將發送一個putItem請求,並且如果給定的鍵已經存在於表中,它將發送另一個updateItem 請求。

APPEND_SET將標量屬性(字符串,數字,二進制)視爲與UPDATE_SKIP_NULL_ATTRIBUTES相同的 。但是,對於設置屬性,它將 附加到現有的屬性值,而不是覆蓋它。 調用者需要確保建模的屬性類型與 現有的類型相匹配,否則會導致服務異常。

UPDATE_SKIP_NULL_ATTRIBUTES類似於更新時,除了它 忽略任何空值屬性(一個或多個),並且不會從該DynamoDB項目 刪除它們。它還保證只發送一個單一的 updateItem請求,而不管該對象是否只有鍵。

DynamoDBMapperConfig SaveBehavior

2)UpdateItemSpectable.updateItem可以用來爲更新一些屬性特定鍵

UpdateItemSpec Example

+0

這是一個很好的答案 - 一個,我可能會使用一些容量。但我特別詢問了重寫save方法來定義我自己的保存邏輯。 – acs254