मैं सहेजे जाने के तुरंत बाद एक इकाई को पुनः प्राप्त करने का प्रयास कर रहा हूं। डिबगिंग करते समय, मैं इकाई सम्मिलित करता हूं, और 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)
0
hocikto 5 अप्रैल 2020, 20:43
क्या आप वह कोड जोड़ सकते हैं जिसका उपयोग आप इकाई बनाने और चर datastore की घोषणा के लिए करते हैं? मेरा मानना ​​है कि आपकी समस्या का संबंध आपके get अनुरोध से है, लेकिन मुझे इसकी पुष्टि करनी होगी।
 – 
Ajordat
6 अप्रैल 2020, 13:37
मैंने कोड जोड़ा
 – 
hocikto
6 अप्रैल 2020, 21:30
मुझे डर है कि यह कोड मूल रूप से प्रदान किए गए नमूने से काफी अलग है और अब मुझे मूल कारण के बारे में संदेह है। क्या आप कृपया उन पंक्तियों को जोड़ सकते हैं जहाँ आप जोड़ी गई इकाई को पुनः प्राप्त करते हैं?
 – 
Ajordat
7 अप्रैल 2020, 12:39
अभी का क्या? मैंने और कोड जोड़ा। यह सिर्फ एक विधि के लिए एक कॉल है जो उस कुंजी को लौटाती है जिसका उपयोग मैं नव निर्मित इकाई की पुनर्प्राप्ति के लिए कर रहा हूं। दो वर्ग हैं, अगर यह मदद करता है ... सेवा बनाने के लिए दाओ को कॉल करती है और फिर सेवा में मैं बनाई गई इकाई को पुनः प्राप्त करने का प्रयास करता हूं
 – 
hocikto
8 अप्रैल 2020, 17:44

2 जवाब

सबसे बढ़िया उत्तर

मेरा मानना ​​है कि आपके कोड के साथ कुछ समस्याएं हैं, लेकिन चूंकि हम आपके कई तरीकों के पीछे तर्क को देखने में असमर्थ हैं, इसलिए मेरा अनुमान यहां आता है।

सबसे पहले, जैसा कि आप दस्तावेज़ीकरण पर देख सकते हैं, यह संभव है एक ही कोड पर एक इकाई को सहेजने और पुनर्प्राप्त करने के लिए, इसलिए यह कोई समस्या नहीं है।

ऐसा लगता है कि आप एक लेन-देन का उपयोग कर रहे हैं, जो एक ही क्रिया में कई संचालन करने के लिए सही है, लेकिन ऐसा नहीं लगता कि आप इसे ठीक से उपयोग करना। ऐसा इसलिए है क्योंकि आप इसे केवल इंस्टेंट करते हैं और इसे बंद करते हैं, लेकिन आप इस पर कोई ऑपरेशन नहीं करते हैं। इसके अलावा, आप डेटाबेस में सहेजने के लिए this.datastore का उपयोग कर रहे हैं, जो पूरी तरह से लेन-देन की उपेक्षा करता है।

तो आप या तो ऑब्जेक्ट को तब सहेजते हैं जब उसके सभी आइटम पहले ही जोड़े जा चुके हों या आप सभी संस्थाओं को एक बार में सहेजने के लिए एक लेनदेन बनाते हैं।

और मेरा मानना ​​है कि बाद में अतिरिक्त खरीदारी प्राप्त करने के लिए आपको entityKey का उपयोग करना चाहिए, लेकिन इसे मिलाना नहीं चाहिए।

इसके अलावा आप बाद वाले को तत्काल करने से पहले Transaction ऑब्जेक्ट this.datastore से बना रहे हैं, लेकिन मुझे लगता है कि यह एक कॉपी-पेस्ट त्रुटि है।

1
Ajordat 9 अप्रैल 2020, 13:44
ध्यान दें कि हम आपकी और मदद नहीं कर सकते क्योंकि प्रदान किया गया कोड कई विधियों और वस्तुओं का उपयोग करता है लेकिन उनके लिए एक परिभाषा है, इस प्रकार हम केवल अनुमान लगा सकते हैं, उदा। entityToObject, this.itemDao.save। यदि यह आपकी समस्या का समाधान नहीं करता है, तो मेरा सुझाव है कि आप अपने कोड का एक क्लीनर संस्करण प्रदान करें जो पूरी तरह से और केवल डेटास्टोर लाइब्रेरी से विधियों या संचालन को दिखाता है।
 – 
Ajordat
9 अप्रैल 2020, 13:48

चूंकि आप इस ऑपरेशन के लिए एक लेन-देन बना रहे हैं, लेन-देन के अंदर इकाई डाल दी जानी चाहिए:

txn.put(builder.builder());

साथ ही, लूप के अंदर के संचालन जहां आप buy.getItems() को newPurchase ऑब्जेक्ट में जोड़ते हैं, उसी लेनदेन के संदर्भ में भी किया जाना चाहिए।

मुझे बताएं कि क्या यह इस मुद्दे को हल करता है।

चीयर्स!

1
Vadim Yushprakh 8 अप्रैल 2020, 18:32