2016-10-30 3 views
0

私はCrudRepositoryを拡張するインタフェースを持っています。既存のオブジェクトを新しいオブジェクトで上書きします。 saveをどのように上書きすれば、そのキーを持つオブジェクトがすでに存在するかどうかを確認できますか?CRUD Repository:Save to Implementが実装されています

私はすでに次のことを試してみましたが、それはうまくいきませんでした:

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()メソッドをオーバーライドしないでこの問題を解決するには、2つの方法があります。

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が保存操作 にモデル化されていない属性には影響しませんし、モデル化された属性にnull値はその項目から にそれを削除しますDynamoDBにあります。 updateItem 要求の制限のため、 のキーのみのオブジェクトが保存されると、UPDATEの実装はputItem要求を送信し、指定されたキーがすでにテーブルに存在する場合は別のupdateItem 要求を送信します。

APPEND_SETは、スカラー属性(String、Number、Binary)をUPDATE_SKIP_NULL_ATTRIBUTESと同じ として扱います。ただし、設定された属性の場合は、既存の属性値に上書きするのではなく、 が追加されます。 呼び出し元は、モデル化された属性タイプが 既存のセットタイプと一致することを確認する必要があります。そうしないと、サービス例外が発生します。

UPDATE_SKIP_NULL_ATTRIBUTESは にnull値の属性(複数可)を無視し、DynamoDBの中にその 項目から削除しないことを除いて、更新することと似ています。また、オブジェクトがキーのみであるかどうかにかかわらず、単一の updateItem要求を送信することも保証されます。私はそうでは使用されます1 -

DynamoDBMapperConfig SaveBehavior

2)table.updateItemUpdateItemSpecは、これは良い答えである特定のキー

UpdateItemSpec Example

+0

のためのいくつかの属性を更新するために使用することができますいくらかの能力。しかし、私は自分のセーブロジックを定義するためにsaveメソッドをオーバーライドすることについて具体的に尋ねました。 – acs254

関連する問題