2016-10-30 5 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, который является дополнительным расширением UPDATE_SKIP_NULL_ATTRIBUTES для типа данных SET.

Пример код: -

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

UPDATE (по умолчанию): UPDATE не будет влиять на unmodeled атрибутов на операции сохранения и нулевое значение для моделируемого атрибута удалит его из этого пункта в «Динамо». Из-за ограничения запроса updateItem реализация UPDATE отправит запрос putItem, когда сохраняется только объект только для ключей, и он отправит еще один запрос updateItem , если указанные ключи уже существуют в таблице.

APPEND_SET обрабатывает скалярные атрибуты (String, Number, Binary) то же самое , что и UPDATE_SKIP_NULL_ATTRIBUTES. Однако для атрибутов набора он добавит к существующему значению атрибута вместо его переопределения. Caller должен убедиться, что тип моделируемого атрибута соответствует существующему типу набора , иначе это приведет к исключению службы.

UPDATE_SKIP_NULL_ATTRIBUTES подобен UPDATE, за исключением того, что она игнорирует атрибут (ы) нулевое значение, а не удалит их из этого пункта в DynamoDB. Он также гарантирует отправку только одного запроса updateItem, независимо от того, является ли объект ключевым или нет.

DynamoDBMapperConfig SaveBehavior

2) UpdateItemSpec с table.updateItem можно использовать для обновления нескольких атрибутов для конкретного ключа

UpdateItemSpec Example

+0

Это хороший ответ - один, что я, вероятно, использовать в некоторые возможности. Но я специально спросил об переопределении метода сохранения для определения моей собственной логики сохранения. – acs254