मैं सहेजे जाने के तुरंत बाद एक इकाई को पुनः प्राप्त करने का प्रयास कर रहा हूं। डिबगिंग करते समय, मैं इकाई सम्मिलित करता हूं, और Google क्लाउड कंसोल में संस्थाओं की जांच करता हूं, मुझे लगता है कि इसे बनाया गया था।
Key key = datastore.put(fullEntity)
उसके बाद, मैं इकाई को प्राप्त करना जारी रखता हूं
datastore.get(key)
, लेकिन कुछ भी नहीं लौटाया जाता है। मैं एक अनुरोध के भीतर सहेजी गई इकाई को कैसे पुनः प्राप्त करूं?
मैंने यह प्रश्न पढ़ा है Google क्लाउड डेटास्टोर में प्रविष्टि के बाद अनुपलब्ध इकाइयां ए> लेकिन मैं केवल 1 इकाई को बचा रहा हूं, उस प्रश्न की तरह दसियों हजार नहीं
मैं Java 11 और google डेटास्टोर (com.google.cloud.datastore. पैकेज) का उपयोग कर रहा हूं*
संपादित करें: जोड़ा गया कोड कैसे इकाई बनाई गई थी
public Key create.... {
// creating the entity inside a method
Transaction txn = this.datastore.newTransaction();
this.datastore = DatastoreOptions.getDefaultInstance().getService();
Builder<IncompleteKey> builder = newBuilder(entitykey);
setLongOrNull(builder, "price", purchase.getPrice());
setTimestampOrNull(builder, "validFrom", of(purchase.getValidFrom()));
setStringOrNull(builder, "invoiceNumber", purchase.getInvoiceNumber());
setBooleanOrNull(builder, "paidByCard", purchase.getPaidByCard());
newPurchase = entityToObject(this.datastore.put(builder.build()));
if (newPurchase != null && purchase.getItems() != null && purchase.getItems().size() > 0) {
for (Item item : purchase.getItems()) {
newPurchase.getItems().add(this.itemDao.save(item, newPurchase));
}
}
txn.commit();
return newPurchase.getKey();
}
उसके बाद, मैं बनाई गई इकाई को पुनः प्राप्त करने का प्रयास कर रहा हूँ
Key key = create(...);
Entity e = datastore.get(key)
2 जवाब
मेरा मानना है कि आपके कोड के साथ कुछ समस्याएं हैं, लेकिन चूंकि हम आपके कई तरीकों के पीछे तर्क को देखने में असमर्थ हैं, इसलिए मेरा अनुमान यहां आता है।
सबसे पहले, जैसा कि आप दस्तावेज़ीकरण पर देख सकते हैं, यह संभव है एक ही कोड पर एक इकाई को सहेजने और पुनर्प्राप्त करने के लिए, इसलिए यह कोई समस्या नहीं है।
ऐसा लगता है कि आप एक लेन-देन का उपयोग कर रहे हैं, जो एक ही क्रिया में कई संचालन करने के लिए सही है, लेकिन ऐसा नहीं लगता कि आप इसे ठीक से उपयोग करना। ऐसा इसलिए है क्योंकि आप इसे केवल इंस्टेंट करते हैं और इसे बंद करते हैं, लेकिन आप इस पर कोई ऑपरेशन नहीं करते हैं। इसके अलावा, आप डेटाबेस में सहेजने के लिए this.datastore
का उपयोग कर रहे हैं, जो पूरी तरह से लेन-देन की उपेक्षा करता है।
तो आप या तो ऑब्जेक्ट को तब सहेजते हैं जब उसके सभी आइटम पहले ही जोड़े जा चुके हों या आप सभी संस्थाओं को एक बार में सहेजने के लिए एक लेनदेन बनाते हैं।
और मेरा मानना है कि बाद में अतिरिक्त खरीदारी प्राप्त करने के लिए आपको entityKey
का उपयोग करना चाहिए, लेकिन इसे मिलाना नहीं चाहिए।
इसके अलावा आप बाद वाले को तत्काल करने से पहले Transaction
ऑब्जेक्ट this.datastore
से बना रहे हैं, लेकिन मुझे लगता है कि यह एक कॉपी-पेस्ट त्रुटि है।
entityToObject
, this.itemDao.save
। यदि यह आपकी समस्या का समाधान नहीं करता है, तो मेरा सुझाव है कि आप अपने कोड का एक क्लीनर संस्करण प्रदान करें जो पूरी तरह से और केवल डेटास्टोर लाइब्रेरी से विधियों या संचालन को दिखाता है।
चूंकि आप इस ऑपरेशन के लिए एक लेन-देन बना रहे हैं, लेन-देन के अंदर इकाई डाल दी जानी चाहिए:
txn.put(builder.builder());
साथ ही, लूप के अंदर के संचालन जहां आप buy.getItems() को newPurchase ऑब्जेक्ट में जोड़ते हैं, उसी लेनदेन के संदर्भ में भी किया जाना चाहिए।
मुझे बताएं कि क्या यह इस मुद्दे को हल करता है।
चीयर्स!
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
google-cloud-platform
Google क्लाउड प्लेटफ़ॉर्म क्लाउड कंप्यूटिंग सेवाएं प्रदान करता है जो आपको एप्लिकेशन और वेबसाइट बनाने, डेटा संग्रहीत करने और Google के बुनियादी ढांचे पर डेटा का विश्लेषण करने की सुविधा देता है।
datastore
की घोषणा के लिए करते हैं? मेरा मानना है कि आपकी समस्या का संबंध आपकेget
अनुरोध से है, लेकिन मुझे इसकी पुष्टि करनी होगी।