हाइबरनेट त्रुटि: org.hibernate.NonUniqueObjectException: समान पहचानकर्ता मान के साथ एक अलग ऑब्जेक्ट पहले से ही सत्र के साथ जुड़ा हुआ था


114

मेरे पास दो उपयोगकर्ता ऑब्जेक्ट हैं और जब मैं उपयोग करके ऑब्जेक्ट को सहेजने का प्रयास करता हूं

session.save(userObj);

मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]

मैं सत्र का उपयोग कर बना रहा हूं

BaseHibernateDAO dao = new BaseHibernateDAO();          

rtsession = dao.getSession(userData.getRegion(),
                           BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);

rttrans = rtsession.beginTransaction();
rttrans.begin();

rtsession.save(userObj1);
rtsession.save(userObj2);

rtsession.flush();
rttrans.commit();

rtsession.close(); // in finally block

मैंने session.clear()बचत करने से पहले भी करने की कोशिश की , फिर भी कोई किस्मत नहीं।

यह पहली बार है कि जब उपयोगकर्ता अनुरोध आता है, तो मैं सत्र ऑब्जेक्ट प्राप्त कर रहा हूं, इसलिए मुझे मिल रहा है इसलिए कहा जा रहा है कि ऑब्जेक्ट सत्र में मौजूद है।

कोई सुझाव?


यहाँ एक और अद्भुत सूत्र है जो मेरे मुद्दे को हल करने में मदद करता है getj2ee.over-blog.com/…
Reddymails

जवाबों:


173

मुझे यह त्रुटि कई बार हुई है और इसे नीचे ट्रैक करना काफी कठिन हो सकता है ...

मूल रूप से, हाइबरनेट जो कह रहा है वह यह है कि आपके पास दो वस्तुएं हैं जिनकी समान पहचानकर्ता (समान प्राथमिक कुंजी) है लेकिन वे एक ही वस्तु नहीं हैं।

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

यह अक्सर कैस्केडिंग सेव के माध्यम से होता है जहां ऑब्जेक्ट ए और बी के बीच कैस्केड सेव होता है, लेकिन ऑब्जेक्ट बी पहले ही सत्र के साथ जुड़ा हुआ है लेकिन ए के समान बी के समान उदाहरण पर नहीं है।

आप किस प्राथमिक कुंजी जनरेटर का उपयोग कर रहे हैं?

मेरे द्वारा पूछे जाने का कारण यह त्रुटि है कि आप किसी वस्तु की लगातार स्थिति का पता लगाने के लिए हाइबरनेट को कैसे बता रहे हैं (यह संबंधित है कि कोई वस्तु स्थायी है या नहीं)। त्रुटि हो सकती है क्योंकि हाइबरनेट एक ऐसी वस्तु को बनाए रखने की कोशिश कर रहा है जो पहले से ही लगातार है। वास्तव में, यदि आप हाइबरनेट का उपयोग करते हैं, तो उस ऑब्जेक्ट को बनाए रखने और बनाए रखने की कोशिश करेंगे, और हो सकता है कि सत्र के साथ संबंधित प्राथमिक कुंजी के साथ कोई ऑब्जेक्ट पहले से ही हो।

उदाहरण

मान लें कि आपके पास एक प्राथमिक कुंजी संयोजन (स्तंभ 1 और स्तंभ 2) के आधार पर 10 पंक्तियों वाली तालिका के लिए एक हाइबरनेट क्लास ऑब्जेक्ट है। अब, आपने किसी समय तालिका से 5 पंक्तियाँ निकाल दी हैं। अब, यदि आप उसी 10 पंक्तियों को फिर से जोड़ने का प्रयास करते हैं, जबकि हाइबरनेट डेटाबेस में वस्तुओं को जारी रखने की कोशिश करता है, तो 5 पंक्तियाँ जो पहले से ही हटा दी गई थीं, उन्हें त्रुटियों के बिना जोड़ा जाएगा। अब शेष 5 पंक्तियाँ जो पहले से मौजूद हैं, इस अपवाद को फेंक देंगी।

तो आसान तरीका यह जाँचना होगा कि क्या आपने किसी तालिका में किसी मूल्य को अद्यतन / हटा दिया है जो किसी चीज़ का हिस्सा है और बाद में आप फिर से उसी वस्तुओं को सम्मिलित करने का प्रयास कर रहे हैं


4
अच्छा उत्तर Nice प्राथमिक कुंजी मेरी समस्या थी, जो GeneratedValue के साथ पोस्टग्रेजल के लिए एक अनुक्रम सेट करने के साथ हल हुई।
रॉड्रिगो फेरारी

2
मेरी भी यही समस्या थी। मेरे मामले में, मुझे एक कोड में खोजा गया एक ऑब्जेक्ट मिला था और मैं कोड के अन्य टुकड़े में उसी आईडी के साथ एक नई ऑब्जेक्ट बनाने की कोशिश कर रहा था जबकि पहली वस्तु अभी तक हाइबरनेट के सत्र में थी।
डेलावासिया

18

यह केवल एक बिंदु है जहां हाइबरनेट की तुलना में अधिक समस्याएं आती हैं। मेरे मामले में एक ही पहचानकर्ता 0 के साथ कई ऑब्जेक्ट हैं, क्योंकि वे नए हैं और एक नहीं है। डीबी उन्हें उत्पन्न करता है। कहीं मैंने पढ़ा है कि 0 संकेत आईडी सेट नहीं है। उन्हें बनाए रखने का सहज तरीका उन पर ध्यान देना और वस्तुओं को बचाने के लिए हाइबरनेट कहना है। लेकिन आप ऐसा नहीं कर सकते - "निश्चित रूप से आपको पता होना चाहिए कि हाइबरनेट इस और इस तरह से काम करता है, इसलिए आपके पास है .." तो अब मैं Ids को लंबे के बजाय लंबे में बदलने की कोशिश कर सकता हूं और अगर यह काम करता है तो देखो। अंत में इसे अपने द्वारा एक साधारण मैपर के साथ करना आसान है, क्योंकि हाइबरनेट केवल एक अतिरिक्त अकर्मक बोझ है। एक और उदाहरण: एक डेटाबेस से मापदंडों को पढ़ने की कोशिश करना और उन्हें दूसरे बलों में जारी रखना जो आपको मैन्युअल रूप से लगभग सभी काम करने के लिए करते हैं।


13
मुझे हाइबरनेट से भी नफरत है ... और डेटाबेस ... सभी समस्याओं के बाद उन्होंने मुझे बताया कि मुझे लगता है कि पाठ फ़ाइल का उपयोग करना आसान है (मैं मजाक कर रहा हूं, लेकिन अभी भी ...)।
इगोर पोपोव

मेरे मामले में एक ही पहचानकर्ता 0 के साथ कई ऑब्जेक्ट हैं, क्योंकि वे नए हैं और एक नहीं है। डीबी उन्हें उत्पन्न करता है। कहीं मैंने पढ़ा है कि 0 संकेत आईडी सेट नहीं है। उन्हें बनाए रखने का सहज तरीका उन पर ध्यान देना और वस्तुओं को बचाने के लिए हाइबरनेट कहना है । मुझे ठीक यही करने की जरूरत है। क्या आप मुझे बता सकते हैं कि ऐसा करने के लिए "हाइबरनेट तरीका" क्या है?
रामसेप्स

मेरे मामले में मुझे session.merge (myobject) का उपयोग करना पड़ा क्योंकि मेरे पास इस ऑब्जेक्ट के दो उदाहरण थे। आमतौर पर ऐसा तब होता है जब सत्र से किसी इकाई को स्थायी और अलग किया जाता है। इस इकाई का एक और उदाहरण हाइबरनेट करने का अनुरोध किया जाता है। यह दूसरा उदाहरण सत्र से जुड़ा रहा। पहला उदाहरण संशोधित है। Getj2ee.over-blog.com/…
Reddymails

यह समस्याओं को हाइबरनेट नहीं कर रहा है, लेकिन यह समझने में कमी है कि यह कैसे काम करता है
ACV

17

का उपयोग करें session.evict(object);का कार्य evict()विधि सत्र कैश से उदाहरण दूर करने के लिए प्रयोग किया जाता है। इसलिए पहली बार ऑब्जेक्ट को सेव session.save(object)करने पर, ऑब्जेक्ट को कैश से बाहर निकालने से पहले कॉल करके मेथड को सेव करें। उसी तरह कॉल करके session.saveOrUpdate(object)या कॉल करने से session.update(object)पहले ऑब्जेक्ट को अपडेट करें ()।


11

यह तब हो सकता है जब आपने पढ़ने और लिखने के लिए एक ही सत्र वस्तु का उपयोग किया हो। कैसे? कहते हैं कि आपने एक सत्र बनाया है। आपने प्राथमिक कुंजी Emp_id = 101 के साथ कर्मचारी तालिका से एक रिकॉर्ड पढ़ा है। आपने जावा में रिकॉर्ड को संशोधित किया है। और आप कर्मचारी रिकॉर्ड को डेटाबेस में सहेजने जा रहे हैं। हमने यहां कहीं भी सत्र को बंद नहीं किया है। जैसा कि पढ़ा गया ऑब्जेक्ट भी सत्र में बना रहा। यह उस वस्तु के साथ संघर्ष करता है जिसे हम लिखना चाहते हैं। इसलिए यह त्रुटि आती है।


9

जैसा कि किसी ने पहले ही बताया था कि जब मैं cascade=allकिसी one-to-manyरिश्ते के दोनों छोर पर था , तो मैं इस समस्या में चला गया , तो चलिए A -> B (A से कई-से-एक और B से कई-से-एक) मान रहा था और B में A और उसके बाद saveOrUpdate (A) को कॉल करने के परिणामस्वरूप, यह एक सर्कुलर सेव रिक्वेस्ट अर्थात A के ए ट्रिगर्स सेव को सेव करता है, जो A के ट्रिगर्स को सेव करता है ... और तीसरे उदाहरण में इकाई (ए के रूप में) के लिए प्रयास किया गया था। सेशन में जोड़ा जाए ।PersistenceContext डुप्लिकेटऑब्जेक्ट अपवाद को फेंक दिया गया था।
  मैं इसे एक छोर से कैस्केड हटाकर हल कर सकता था।


मेरी समस्या एक साथ हल के साथ stackoverflow.com/questions/4334970/...
मैग्नो सी

5

आप उपयोग कर सकते हैं session.merge(obj), यदि आप एक ही पहचानकर्ता के साथ अलग-अलग सत्रों के साथ कर रहे हैं लगातार वस्तु।
यह काम किया, मैं पहले भी यही मुद्दा था।


4

मैं भी इस समस्या में भाग गया और त्रुटि को खोजने के लिए एक कठिन समय था।

मेरे पास जो समस्या थी वह निम्नलिखित थी:

ऑब्जेक्ट को एक अलग हाइबरनेट सत्र के साथ एक डीएओ द्वारा पढ़ा गया है।

इस अपवाद से बचने के लिए, इस ऑब्जेक्ट को बाद में सहेजने / अद्यतन करने के लिए जा रहे डाओ के साथ बस ऑब्जेक्ट को फिर से पढ़ें।

इसलिए:

class A{      

 readFoo(){
       someDaoA.read(myBadAssObject); //Different Session than in class B
    }

}

class B{



 saveFoo(){
       someDaoB.read(myBadAssObjectAgain); //Different Session than in class A
       [...]
       myBadAssObjectAgain.fooValue = 'bar';
       persist();
    }

}

आशा है कि कुछ लोगों को बहुत समय बचाओ!


4

मैं इस समस्या से भाग गया:

  1. किसी ऑब्जेक्ट को हटाना (HQL का उपयोग करके)
  2. तुरंत उसी आईडी के साथ एक नई वस्तु का भंडारण

मैंने डिलीट होने के बाद रिजल्ट्स को फ्लश करके और नई ऑब्जेक्ट को सेव करने से पहले कैशे को क्लियर करके इसे हल किया

String delQuery = "DELETE FROM OasisNode";
session.createQuery( delQuery ).executeUpdate();
session.flush();
session.clear();

4

यह समस्या तब होती है जब हम सत्र के उसी ऑब्जेक्ट को अपडेट करते हैं, जिसका उपयोग हमने डेटाबेस से ऑब्जेक्ट लाने के लिए किया है।

आप अद्यतन विधि के बजाय हाइबरनेट की मर्ज विधि का उपयोग कर सकते हैं।

उदा। पहले प्रयोग सत्र () और फिर आप सत्र का उपयोग कर सकते हैं। वस्तु (वस्तु)। इस विधि से कोई समस्या नहीं होगी। हम डेटाबेस में ऑब्जेक्ट को अपडेट करने के लिए मर्ज () विधि का भी उपयोग कर सकते हैं।


3

सत्र के अंदर वस्तु प्राप्त करें, यहाँ एक उदाहरण है:

MyObject ob = null;
ob = (MyObject) session.get(MyObject.class, id);

3
अच्छा प्रयास करें, लेकिन ऑब्जेक्ट "ओब" को अपडेट किए गए डेटा के बिना लौटाया जाता है (यह विचार करते हुए कि डेटाबेस से प्राप्त होने वाली वस्तुओं और इसकी बचत के बीच, रनटाइम के दौरान एप्लिकेशन के माध्यम से इसे अपडेट किया गया था)।
एलेक्स

2

क्या आपकी आईडी मैपिंग सही है? यदि डेटाबेस पहचानकर्ता के माध्यम से आईडी बनाने के लिए ज़िम्मेदार है, तो आपको अपना उपयोगकर्ता नाम उस पर मैप करने की आवश्यकता है ..


2

मैंने किसी ऑब्जेक्ट को हटाने के साथ इस समस्या का सामना किया, न तो बेदखल किया और न ही मदद की।

/**
 * Deletes the given entity, even if hibernate has an old reference to it.
 * If the entity has already disappeared due to a db cascade then noop.
 */
public void delete(final Object entity) {
  Object merged = null;
  try {
    merged = getSession().merge(entity);
  }
  catch (ObjectNotFoundException e) {
    // disappeared already due to cascade
    return;
  }
  getSession().delete(merged);
}

2

उस स्थिति से पहले जहां दोहरावदार वस्तुएं शुरू होती हैं, आपको सत्र बंद करना चाहिए और फिर आपको एक नया सत्र शुरू करना चाहिए

session.close();      
session = HibernateUtil.getSessionFactory().openSession();

तो इस तरह से एक सत्र में एक से अधिक इकाइयाँ नहीं हैं जिनके पास समान पहचानकर्ता है।


2

पार्टी के लिए देर से, लेकिन आने वाले उपयोगकर्ताओं के लिए मदद कर सकते हैं -

मुझे यह मुद्दा तब मिला जब मैं एक रिकॉर्ड का उपयोग करके चयन करता हूं getsession() और फिर से उसी सत्र का उपयोग करके एक ही पहचानकर्ता के साथ एक और रिकॉर्ड को अपडेट करता हूं जो समस्या का कारण बनता है। नीचे कोड जोड़ा गया।

Customer existingCustomer=getSession().get(Customer.class,1);
Customer customerFromUi;// This customer details comiong from UI with identifer 1

getSession().update(customerFromUi);// Here the issue comes

ऐसा कभी नहीं करना चाहिए। समाधान या तो अपडेट सत्र से पहले बेदखली सत्र है या व्यापार तर्क बदलते हैं।


1

जांचें कि क्या आप @ आईड कॉलम के लिए @GenerateValue लगाना भूल गए हैं। मुझे मूवी और शैली के बीच कई संबंधों के साथ एक ही समस्या थी। कार्यक्रम ने हाइबरनेट त्रुटि को फेंक दिया: org.hibernate.NonUniqueObjectException: समान पहचानकर्ता मान के साथ एक अलग ऑब्जेक्ट पहले से ही सत्र त्रुटि के साथ जुड़ा हुआ था। मुझे बाद में पता चला कि मुझे सिर्फ यह सुनिश्चित करना है कि आपके पास GenreId पाने का तरीका @GenerateValue है।


मैं आपके प्रश्न का समाधान कैसे लागू कर सकता हूं? क्या मैं टास्क क्लास में एक आईडी कॉलम बनाता हूं? stackoverflow.com/questions/55732955/…
sbattou

1

बस आईडी की जाँच करें कि क्या यह अशक्त है या 0 पसंद है

if(offersubformtwo.getId()!=null && offersubformtwo.getId()!=0)

ऐड या अपडेट में जहां सामग्री फॉर्म से पूजो तक सेट की जाती है


1

मैं NHibernate के लिए नया हूं, और मेरी समस्या यह थी कि मैंने अपनी वस्तु को बचाने के लिए अपनी वस्तु को क्वेरी करने के लिए एक अलग सत्र का उपयोग किया। तो बचत सत्र वस्तु के बारे में नहीं जानता था।

यह स्पष्ट प्रतीत होता है, लेकिन पिछले उत्तरों को पढ़ने से मैं 2 वस्तुओं के लिए हर जगह देख रहा था, 2 सत्र नहीं।


1

@GeneratedValue (कार्यनीति = GenerationType.IDENTITY), इस एनोटेशन को अपनी इकाई बीन में प्राथमिक कुंजी गुण से जोड़कर इस समस्या को हल करना चाहिए।


1

मैंने इस समस्या का समाधान किया।
वास्तव में यह इसलिए हो रहा है क्योंकि हम बीन क्लास में जेनरेटर प्रकार के पीके संपत्ति के कार्यान्वयन को भूल गए। इसलिए इसे किसी भी प्रकार से बनाएं

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;

जब हम बीन की वस्तुओं को बनाए रखते हैं, तो प्रत्येक वस्तु उसी आईडी का अधिग्रहण करती है, इसलिए पहली वस्तु को बचाया जाता है, जब कोई अन्य वस्तु बनी रहती है तो एचआईबी एफडब्ल्यू इस प्रकार की Exception: org.hibernate.NonUniqueObjectException:एक अलग पहचानकर्ता के साथ एक ही पहचानकर्ता मान के साथ पहले से ही सत्र के साथ जुड़ा हुआ था।


1

समस्या इसलिए होती है क्योंकि एक ही हाइबरनेट सत्र में आप एक ही पहचानकर्ता के साथ दो वस्तुओं को बचाने की कोशिश कर रहे हैं। दो समाधान हैं: -

  1. यह इसलिए हो रहा है क्योंकि आपने नीचे दिए गए आईडी फ़ील्ड के लिए अपनी mapping.xml फ़ाइल को सही तरीके से कॉन्फ़िगर नहीं किया है: -

    <id name="id">
      <column name="id" sql-type="bigint" not-null="true"/>
      <generator class="hibernateGeneratorClass"</generator>
    </id>
  2. इस तरह के एक समांतर को स्वीकार करने के लिए गेटसेशन विधि को अधिभारित करें जैसे कि सत्रांक, और नीचे दिए गए वर्तमान सत्र को वापस करने से पहले सत्र को साफ़ करें

    public static Session getSession(boolean isSessionClear) {
        if (session.isOpen() && isSessionClear) {
            session.clear();
            return session;
        } else if (session.isOpen()) {
            return session;
        } else {
            return sessionFactory.openSession();
        }
    }

इससे मौजूदा सत्र ऑब्जेक्ट साफ़ हो जाएंगे और यहां तक ​​कि अगर हाइबरनेट एक विशिष्ट पहचानकर्ता उत्पन्न नहीं करता है, तो मान लें कि आपने अपने डेटाबेस को Auto_Increment जैसी किसी प्राथमिक कुंजी के लिए ठीक से कॉन्फ़िगर किया है, तो यह आपके लिए काम करना चाहिए।


1

मुझे भी ऐसी ही समस्या का समाधान करना पड़ा था। मेरे मामले में मैं स्थापित करने के लिए भूल गया था increment_byद्वारा इस्तेमाल किया एक की तरह ही हो डेटाबेस में मूल्य cache_sizeऔरallocationSize । (तीर उल्लिखित विशेषताओं को इंगित करते हैं)

एसक्यूएल:

CREATED         26.07.16
LAST_DDL_TIME   26.07.16
SEQUENCE_OWNER  MY
SEQUENCE_NAME   MY_ID_SEQ
MIN_VALUE       1
MAX_VALUE       9999999999999999999999999999
INCREMENT_BY    20 <-
CYCLE_FLAG      N
ORDER_FLAG      N
CACHE_SIZE      20 <-
LAST_NUMBER     180

जावा:

@SequenceGenerator(name = "mySG", schema = "my", 
sequenceName = "my_id_seq", allocationSize = 20 <-)

1

अन्यथा wbdarby ने क्या कहा, यह तब भी हो सकता है जब किसी वस्तु को HQL करने के लिए वस्तु के पहचानकर्ता को दिया जाता है। वस्तु क्षेत्रों को संशोधित करने और इसे वापस डीबी में सहेजने की कोशिश के मामले में ( एक ही सत्र में संशोधन सम्मिलित किया जा सकता है, हटा या अद्यतन किया जा सकता है) , यह त्रुटि दिखाई देगी। अपनी संशोधित वस्तु को बचाने या एक नया सत्र बनाने से पहले हाइबरनेट सत्र को साफ़ करने का प्रयास करें।

आशा है कि मैंने मदद की; ;-)


1

मेरे पास वही त्रुटि है जो मैं अपने सेट की जगह जैक्सन से प्राप्त कर रहा था।

इसे हल करने के लिए मैं मौजूदा सेट रखता हूं, मैं पुराने सेट से अज्ञात तत्व को नई सूची में हटा देता हूं retainAll। फिर मैं नए लोगों को जोड़ता हूं addAll

    this.oldSet.retainAll(newSet);
    this.oldSet.addAll(newSet);

सत्र होने और उसमें हेरफेर करने की आवश्यकता नहीं है।


1

इसे इस्तेमाल करे। नीचे मेरे लिए काम किया!

में hbm.xmlफ़ाइल

  1. हमें dynamic-updateवर्ग टैग की विशेषता निर्धारित करने की आवश्यकता है true:

    <class dynamic-update="true">
  2. अद्वितीय कॉलम के अंतर्गत जनरेटर टैग की वर्ग विशेषता निर्धारित करें identity:

    <generator class="identity">

नोट: के identityबजाय अद्वितीय स्तंभ सेट करें assigned


0

एक और चीज जो मेरे लिए काम करती थी वह थी इंस्टेंस वेरिएबल को लॉन्ग ऑफ लॉन्ग की जगह


मेरे पास मेरी प्राथमिक कुंजी चर लंबी आईडी थी; इसे लॉन्ग आईडी में बदलना; काम

शुभकामनाएं


0

आप हमेशा एक सत्र फ्लश कर सकते हैं। फ्लश सत्र में आपकी सभी वस्तुओं की स्थिति को सिंक्रनाइज़ करेगा (कृपया, कोई मुझे सही कर रहा है अगर मैं गलत हूं), और शायद यह कुछ मामलों में आपकी समस्या को हल करेगा।

अपने खुद के बराबरी और हैशकोड को लागू करने से आपको भी मदद मिल सकती है।


0

आप अपनी कैस्केड सेटिंग्स की जांच कर सकते हैं। आपके मॉडल पर कैस्केड सेटिंग इसका कारण बन सकती है। मैंने Cascade Settings (अनिवार्य रूप से Cascade Inserts / Updates की अनुमति नहीं दी) को हटा दिया और इससे मेरी समस्या हल हो गई


0

मुझे भी यह त्रुटि मिली। मेरे लिए जो काम किया गया है, वह यह सुनिश्चित करने के लिए है कि प्राथमिक कुंजी (जो ऑटो-जेनरेट की गई है) पीडीटी (यानी लंबी, इंट, एक्ट) नहीं है, लेकिन एक ऑब्जेक्ट (यानी लॉन्ग, इंटेगर, आदि)

जब आप इसे सहेजने के लिए अपना ऑब्जेक्ट बनाते हैं, तो सुनिश्चित करें कि आप शून्य से गुजरते हैं और 0 नहीं।



0

मैंने इस तरह की एक समस्या का समाधान किया है:

plan = (FcsRequestPlan) session.load(plan.getClass(), plan.getUUID());
while (plan instanceof HibernateProxy)
    plan = (FcsRequestPlan) ((HibernateProxy) plan).getHibernateLazyInitializer().getImplementation();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.