java - Using update queries with objectdb -


निम्न कोड:

  EntityManagerFactory emf = persistence.createEntityManagerFactory ("test.odb" ); EntityManager em = emf.createEntityManager (); em.getTransaction () शुरू ()।; बिंदु पी = नया बिंदु (0, 0); em.persist (पी); em.getTransaction () के लिए प्रतिबद्ध ()।; em.getTransaction () शुरू ()।; क्वेरी क्वेरी = em.createQuery ("UPDATE Point SET x = 1001 जहां x = 0"); Int updateCount = query.executeUpdate (); em.getTransaction () के लिए प्रतिबद्ध ()।; TypedQuery & LT; प्वाइंट & gt; Myquery = em.createQuery ("चयन पी से पॉइंट पी जहां p.x = 1001", Point.class); सूची के & lt; प्वाइंट & gt; परिणाम = myquery.getResultList (); System.out.println ("एक्स समन्वय है:" + results.get (0) .getX ()); em.close ();   

प्रिंट करता है: एक्स समन्वय है: 0 जो गलत है, क्योंकि एक्स निर्देशांक 1001 होना चाहिए

लेकिन अगर मैं कोड को बदलता हूं:

  EntityManagerFactory emf = Perseverence.createEntityManagerFactory ("test.odb"); EntityManager em = emf.createEntityManager (); em.getTransaction () शुरू ()।; बिंदु पी = नया बिंदु (0, 0); em.persist (पी); em.getTransaction () के लिए प्रतिबद्ध ()।; em.getTransaction () शुरू ()।; क्वेरी क्वेरी = em.createQuery ("UPDATE Point SET x = 1001 जहां x = 0"); Int updateCount = query.executeUpdate (); em.getTransaction () के लिए प्रतिबद्ध ()।; em.close (); Em = emf.createEntityManager (); TypedQuery & LT; प्वाइंट & gt; Myquery = em.createQuery ("चयन पी से पॉइंट पी जहां p.x = 1001", Point.class); सूची के & lt; प्वाइंट & gt; परिणाम = myquery.getResultList (); System.out.println ("एक्स समन्वय है:" + results.get (0) .getX ()); em.close ();   

परिणाम अपेक्षा के समान है:

एक्स समन्वय है: 1001

मैंने पहले कोड स्निपेट में क्या किया है?

अद्यतन क्वेरी EntityManager को बायपास करते हैं, जिसका अर्थ है कि EntityManager को वास्तविक ऑब्जेक्ट के अप-टू-डेट दृश्य नहीं हो सकता है जैसा कि ObjectDB मैनुअल में बताया गया है:

"UPDATE क्वेरी का उपयोग करते हुए डेटाबेस में इकाई ऑब्जेक्ट्स को अद्यतन करना इकाई वस्तुओं को पुनः प्राप्त करने और फिर अपडेट करने से थोड़ा अधिक कुशल हो सकता है उन्हें, लेकिन इसे सावधानी से इस्तेमाल किया जाना चाहिए क्योंकि EntityManager को बायपास करना डेटाबेस के साथ अपना सिंक्रनाइज़ेशन तोड़ सकता है.उदाहरण के लिए, EntityManager को अवगत नहीं हो सकता है कि इसकी स्थायीता संदर्भ में एक कैश्ड इकाई ऑब्जेक्ट को UPDATE क्वेरी द्वारा संशोधित किया गया है। UPDATE क्वेरी के लिए एक अलग इकाई प्रबंधक का उपयोग करने के लिए एक अच्छा अभ्यास है। "

एक अलग EntityManager का उपयोग करना ठीक उसी प्रकार है जो आपने एक नया EntityManager को बंद करने और खोलने में किया था आपका संशोधित कोड।

वैकल्पिक रूप से, यदि आप एक ही इकाई प्रबंधक का उपयोग करना चाहते हैं, तो आप (यानी, इसकी कैश), UPDATE क्वेरी चलाने और SELECT क्वेरी चलाने से पहले।

Comments

Popular posts from this blog

asp.net - Procedure or function "Procedure name" expects a parameter "Param name" which was not supplied occurs rarely -

c# - The item with identity 'Id' already exists in the metadata collection. Parameter name: item -

c++ - Redefined variable in the other module -