2016-04-28 15 views
11

में तारों के खाली जावा सेट को कैसे प्रबंधित करूं IAWS DynamoDB तालिका में स्ट्रिंग्स की सरणी को स्टोर करने का प्रयास कर रहा हूं। अधिकांश भाग के लिए यह सरणी कम से कम एक स्ट्रिंग के साथ आबादी होगी। हालांकि ऐसा मामला है जहां सरणी खाली हो सकती है।मैं AWS DynamoDB

मैंने जावा लैम्ब्डा फ़ंक्शन में एक डायनेमोडीबी मॉडल बनाया है जिसमें तारों का एक सेट इसके गुणों में से एक है। यदि मैं डायनामो डीबी मॉडल को सहेजने का प्रयास करता हूं तो तारों का सेट खाली होता है तो यह मुझे एक त्रुटि देता है कि मैं डायनामो डीबी में एक खाली सेट स्टोर नहीं कर सकता।

तो मेरा सवाल यह है कि डायनेमो डीबी में इसे सहेजने/अपडेट करने से पहले मेरे मॉडल से खाली होने पर उस सेट संपत्ति को हटाने में कैसे संभाल लेंगे?

यहां मॉडल का एक उदाहरण दिया गया है।

@DynamoDBTable(tableName = "group") 
public class Group { 
    private String _id; 
    private Set<String> users; 

    @Null 
    @DynamoDBHashKey 
    @DynamoDBAutoGeneratedKey 
    public String getId() { 
     return _id; 
    } 

    public void setId(final String id) { 
     _id = id; 
    } 

    @DynamoDBAttribute 
    public Set<String> getUsers(){ 
     return users; 
    } 

    public void setUsers(final Set<String> users) { 
     this.users = users; 
    } 

    public void addUser(String userId) { 
     if(this.users == null){ 
      this.setUsers(new HashSet<String>(Arrays.asList(userId))); 
     }else{ 
      this.getUsers().add(userId); 
     } 
    } 
} 

पहली बार जब मैं एक समूह बनाउंगा। इसमें कोई उपयोगकर्ता नहीं हो सकता है, या इसमें एक या अधिक उपयोगकर्ता हो सकते हैं।

+0

एडब्ल्यूएस तकनीकी समर्थन के साथ इसके बारे में और बातचीत के आधार पर यह स्वीकार किया गया है कि स्वीकार्य अभ्यास वास्तव में मौजूदा आइटम को हटाना है और उसी प्राथमिक इंडेक्स के साथ एक नई वस्तु को फिर से निकालना है जो संपत्ति को छोड़कर छोड़ देगा। मैंने कोशिश की और इसके साथ कोई भाग्य नहीं था। –

+0

इसका मतलब है कि हम इस तरह की स्थिति के लिए किसी भी जावा POJO कक्षा का उपयोग नहीं कर सकते हैं? –

उत्तर

0

जब यह वास्तविक समस्या पर आया तो ऐसा इसलिए था क्योंकि मेरे द्वारा प्राप्त कोड को डायनेमोडबैपरपर कॉन्फिग पर SaveBehavior को UPDATE_SKIP_NULL_ATTRIBUTES पर सेट किया गया था जो शून्य मानों को छोड़ देता है और इसलिए उन्हें डायनेमो डीबी से कभी नहीं हटाएगा। सभी अलग-अलग सहेजे गए व्यवहारों के स्पष्टीकरण के इस पोस्ट को देखें। https://java.awsblog.com/post/Tx1MH3BFPW8FX6W/Using-the-SaveBehavior-Configuration-for-the-DynamoDBMapper

इस पर थोड़ा और विस्तार करने के लिए।

मैं अपने जावामा प्रोजेक्ट के भीतर अपना डायनेमो डीबीएम्पर कॉनफिग। सेवबैवियर सेट कर रहा हूं।

_dynamoDBMapperConfig = new DynamoDBMapperConfig.Builder() .withSaveBehavior(SaveBehavior.UPDATE) .withTableNameResolver(TABLE_NAME_RESOLVER) .withConversionSchema(ConversionSchemas.V2) .build();

तो जब भी आप एक मॉडल है कि एक मैप किया @DynamoDBAttribute है अद्यतन आप भी करने के लिए (शून्य) विशेष मूल्य निर्धारित करने की आवश्यकता।

user.setFirstName(null) 

यह डायनेमो डीबी प्रविष्टि से विशेषताओं को हटाने में सक्षम होने का सबसे आसान तरीका था।

1

यह कुछ हद तक एक पुराना सवाल है, लेकिन जिस तरह से मैं इस समस्या को हल करता हूं वह कस्टम DynamoDBMarshaller के साथ है।

@DynamoDBMarshalling एनोटेशन का उपयोग करना, आप डायनेमो डीबी मैपर को निर्देशित करने के लिए पीओजेओ एक्सेसर विधियों को सजाने के लिए तैयार कर सकते हैं, जो मार्शेलर क्लास को स्ट्रिंग्स के सेट को क्रमबद्ध और deserialize करने के लिए उपयोग करने के लिए उपयोग करते हैं। इस तरह आप विशेष उपयोग मामलों पर नियंत्रण प्राप्त करते हैं।

यहाँ भी एक link to an AWS blog post with an example

एक दृष्टिकोण के साथ चेतावनी ऊपर ग्राहक marshaller समाधान को धारावाहिक है और स्ट्रिंग से/deserializes तो डेटाबेस में प्रतिनिधित्व एक सेट से प्रति नहीं होगा है। हालांकि, मैं उस पर बहुत बुरा नहीं मानूंगा।

ऑब्जेक्ट मैपर के बजाय Document API का उपयोग करने का एक और तरीका हो सकता है, जो आपको आइटम पर पूर्ण नियंत्रण देता है। हालांकि मैं अभी भी स्ट्रिंग बैकिंग के साथ कस्टम मैपर के लिए जाऊंगा।

+0

धन्यवाद!मैं इसे लागू करने की कोशिश करूंगा। –

संबंधित मुद्दे