2016-10-30 1 views
0

Ich habe eine Schnittstelle, die CrudRepository erweitert, und jedes Mal, wenn ich ein Objekt mit einem bereits vorhandenen Schlüssel speichern, überschreibt es das vorhandene Objekt mit dem neuen. Wie kann ich save überschreiben, so dass es überprüft, ob ein Objekt mit diesem Schlüssel bereits existiert?CRUD Repository: Überschreiben speichern zu Implementieren existiert

Ich habe bereits versucht, die folgende, aber es hat nicht funktioniert:

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); 

} 

Antwort

0

Problem: ich das Problem Aussage verstehen „alle vorhandenen Nicht-Schlüsselattribute werden mit neuem Wert ersetzt“ statt die URL- und TITLE-Attribute, die Sie zu aktualisieren versuchen.

Es gibt zwei Möglichkeiten, dieses Problem zu lösen, ohne die Methode save() zu überschreiben.

1) SaveBehavior kann entsprechend eingestellt werden, um die Attribute entsprechend zu aktualisieren. In Ihrem Code haben Sie das Standard-Speicherverhalten UPDATE verwendet. Sie können das Speicherverhalten UPDATE_SKIP_NULL_ATTRIBUTES verwenden, damit die NULL-Attribute im Modellobjekt nicht aktualisiert werden (in Ihrem Fall ist es der Kanal).

Sie können auch APPEND_SET betrachten, was eine weitere Erweiterung von UPDATE_SKIP_NULL_ATTRIBUTES für den SET-Datentyp darstellt.

Beispielcode: -

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

UPDATE (Standard): UPDATE unmodellierte Attribute nicht beeinflussen wird auf einem Betrieb speichern und ein Nullwert für das modellierte Attribut es von diesem Punkt entfernen in DynamoDB. Aufgrund der Beschränkung der Anforderung updateItem sendet die Implementierung von UPDATE eine putItem-Anforderung, wenn ein Nur-Schlüssel-Objekt gespeichert wird, und sendet eine weitere Anforderung updateItem , wenn die angegebenen Schlüssel bereits in der Tabelle vorhanden sind.

APPEND_SET behandelt skalare Attribute (String, Number, Binary) gleich wie UPDATE_SKIP_NULL_ATTRIBUTES tut. Bei Set-Attributen wird es jedoch an den vorhandenen Attributwert angehängt, statt ihn zu überschreiben ( ). Der Aufrufer muss sicherstellen, dass der modellierte Attributtyp dem vorhandenen Settyp entspricht, andernfalls würde dies zu einer Serviceausnahme führen.

UPDATE_SKIP_NULL_ATTRIBUTES ist ähnlich zu aktualisieren, außer dass es ignoriert alle Nullwert Attribut (e) und wird sie nicht von dem Artikel in DynamoDB entfernen. Es garantiert auch, dass nur eine einzelne updateItem-Anfrage gesendet wird, unabhängig davon, ob das Objekt "key-only" ist oder nicht.

DynamoDBMapperConfig SaveBehavior

2) Die UpdateItemSpec mit table.updateItem kann verwendet werden, für einige Attribute zu aktualisieren einen bestimmten Schlüssel

UpdateItemSpec Example

+0

Dies ist eine gute Antwort - eine, die ich wahrscheinlich in wird verwenden etwas Kapazität. Aber ich habe speziell gefragt, ob ich die Speichermethode überschreiben soll, um meine eigene Speicherlogik zu definieren. – acs254

Verwandte Themen