दिलचस्प पोस्ट
एएसपी.नेट एमवीसी 4 कस्टम ऑथराइज एट्रिब्यूट – अनधिकृत उपयोगकर्ताओं को त्रुटि पेज पर दिशानिर्देश कैसे करें? Jquery निर्भर ड्रॉप डाउन बक्से पॉप्युलेट – कैसे पायथन फाइलों का सामान्य हेडर प्रारूप क्या है? एकाधिक विरासत का उपयोग करते समय मैं डायमंड ऑफ़ डेथ से कैसे बच सकता हूं? नियंत्रकों में कोणीय-अनुवाद के लिए सही उपयोग जावास्क्रिप्ट में जेएसटीएल वैरिएबल वैल्यू कैसे सेट करें? मैं फाइल स्थान प्रोग्राम को कैसे बदल सकता हूं? मैं jQuery में पृष्ठभूमि छवि आकार कैसे प्राप्त करूं? मैं एक ही डेटा पर दो बार पुनरावृत्त नहीं क्यों कर सकता हूं? Tensorflow में एक कस्टम अजगर फ़ंक्शन का उपयोग करके डेटा को प्रीफ़ेच कैसे करें स्ट्रिंग नाम का उपयोग किए बिना संपदा-बदले गए ईवेंट को कैसे बढ़ाएं क्या मैं shared_ptr या unique_ptr का उपयोग करना चाहिए कैसे परीक्षण करने के लिए कि कोई अपवाद नहीं फेंक दिया जाता है? क्या एमडी 5 हैश डिक्रिप्ट करना संभव है? HttpURLConnection (java.net.CookieManager) से WebView (android.webkit.CookieManager) से कुकीज़ पास करें

जब EntityManager.find () बनाम EntityManager.getReference () का उपयोग करें

मैं एक ऐसी स्थिति में आया हूं (जो मुझे लगता है कि यह अजीब है लेकिन संभवतः काफी सामान्य है) जहां मैं EntityManager.getReference (LObj.getClass (), LObj.getId ()) का उपयोग डेटाबेस इकाई प्राप्त करने के लिए करता हूं और फिर लौटा हुआ ऑब्जेक्ट को दूसरे टेबल में बने रहें

तो मूल रूप से प्रवाह इस तरह था:

 वर्ग TFacade {

   createT (एफओबीजे, एओबीजे) {
     टी टूबज = नया टी ();
     TObj.setF (FObj);
     TObj.setA (AObj);
     ...
     EntityManager.persist (TObj);
     ...
     एल LObj = A.getL ();
     FObj.setL (LObj);
     FFacade.editF (FObj);
   }
 }

 @ TransactionAttributeType.REQUIRES_NEW
 कक्षा FFacade {

   editF (FObj) {
     एल LObj = FObj.getL ();
     LObj = EntityManager.getReference (LObj.getClass (), LObj.getId ());
     ...
     EntityManager.merge (FObj);
     ...
     एफएचएचएफएकेड.क्रेडिट (एफओबीजे, लोब);
   }
 }

 @ TransactionAttributeType.REQUIRED
 क्लास एफएचएचएफ़ैकेड {

   बनाने एफएलएच (एफओबीजे, लोब) {
     FLH FLHObj = नया FLH ();
     FLHObj.setF (FObj);
     FLHObj.setL (LObj);
     ....
     EntityManager.persist (FLHObj);
     ...
   }
 }

मुझे निम्नलिखित अपवाद "java.lang.IllegalArgumentException: अज्ञात इकाई: com.my.preistence.L $$ EnhancerByCGLIB $$ 3e7987d0" मिल रहा था

थोड़ी देर के लिए इस पर गौर करने के बाद, मुझे अंत में पता चला कि यह इसलिए था क्योंकि मैं EntityManager.getReference () विधि का उपयोग कर रहा था, जिस पर मुझे ऊपर अपवाद मिल रहा था, विधि के रूप में एक प्रॉक्सी लौट रहा था।

इससे मुझे आश्चर्य होता है, जब EntityManager.find () विधि के बजाय EntityManager.getReference () विधि का उपयोग करने की सलाह दी जाती है ?

EntityManager.getReference () एक EntityNotFoundException फेंकता है अगर वह खोज नहीं किया जा रहा है जो इकाई खोज के लिए है जो अपने आप में बहुत सुविधाजनक है EntityManager.find () विधि केवल रिक्त रिटर्न अगर यह इकाई नहीं मिल सकता है।

लेन-देन की सीमाओं के संबंध में, मुझे लगता है जैसे आप नए तत्वों को एक नए लेनदेन के पास करने से पहले () विधि का उपयोग करने की आवश्यकता होगी। यदि आप getReference () पद्धति का उपयोग करते हैं, तो शायद आप ऊपर की अपवाद के साथ मेरी स्थिति के समान ही समाप्त हो जाएंगे।

वेब के समाधान से एकत्रित समाधान "जब EntityManager.find () बनाम EntityManager.getReference () का उपयोग करें"

मैं आमतौर पर getReference विधि का उपयोग करता हूं जब मुझे डाटाबेस स्थिति तक पहुंचने की ज़रूरत नहीं होती है (मेरा मतलब है गेटर विधि)। बस राज्य को बदलने के लिए (मैं सेटर विधि मतलब है) जैसा कि आपको पता होना चाहिए, getReference एक प्रॉक्सी ऑब्जेक्ट देता है जो स्वचालित गंदा जांच नामक एक शक्तिशाली सुविधा का उपयोग करता है निम्नलिखित मान लीजिए

public class Person { private String name; private Integer age; } public class PersonServiceImpl implements PersonService { public void changeAge(Integer personId, Integer newAge) { Person person = em.getReference(Person.class, personId); // person is a proxy person.setAge(newAge); } } 

अगर मैं विधि ढूंढता हूं, तो जेपीए प्रदाता, पर्दे के पीछे, कॉल करेंगे

 SELECT NAME, AGE FROM PERSON WHERE PERSON_ID = ? UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ? 

अगर मैं getrereference विधि कॉल, जेपीए प्रदाता, पर्दे के पीछे, कॉल करेंगे

 UPDATE PERSON SET AGE = ? WHERE PERSON_ID = ? 

और तुम्हें पता है क्यों ???

जब आप getreference को कॉल करते हैं, तो आपको एक प्रॉक्सी ऑब्जेक्ट मिलेगा। इस तरह से कुछ (जेपीए प्रदाता इस प्रॉक्सी को कार्यान्वित करने का ख्याल रखता है)

 public class PersonProxy { // JPA provider sets up this field when you call getReference private Integer personId; private String query = "UPDATE PERSON SET "; private boolean stateChanged = false; public void setAge(Integer newAge) { stateChanged = true; query += query + "AGE = " + newAge; } } 

लेनदेन प्रतिबद्ध होने से पहले, जेपीए प्रदाता को अपडेट करने के लिए या नोड व्यक्ति इकाई को बदलकर झंडी दिखाई देगी। यदि अद्यतन कथन के बाद कोई पंक्ति अपडेट नहीं की जाती है, तो जेपीए प्रदाता JPY विनिर्देश के अनुसार EntityNotFoundException फेंक देगा।

सादर,

क्योंकि एक संदर्भ 'प्रबंधित' है, लेकिन हाइड्रेटेड नहीं है, यह आपको आईडी में किसी संस्था को निकालने की अनुमति भी दे सकता है, बिना इसे स्मृति में पहले लोड करने की आवश्यकता है।

जैसा कि आप एक अप्रबंधित इकाई को नहीं हटा सकते हैं, यह खोजने के लिए (…) या createQuery (…) का उपयोग करते हुए सभी फ़ील्ड लोड करने के लिए, केवल इसे तुरंत हटा देने के लिए केवल सादा मूर्खतापूर्ण है

 MyLargeObject myObject = em.getReference(MyLargeObject.class, objectId); em.remove(myObject);