जेपीए और हाइबरनेट में दृढ़ता () और मर्ज () के बीच अंतर क्या है?


119

हाइबरनेट में दृढ़ता () और मर्ज () के बीच अंतर क्या है?

persist() एक अद्यतन और INSERT क्वेरी बना सकते हैं, जैसे:

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();

इस स्थिति में क्वेरी इस तरह उत्पन्न की जाएगी:

Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?

तो persist()विधि एक सम्मिलित और एक अद्यतन उत्पन्न कर सकते हैं

अब इसके साथ merge():

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

यह वही है जो मैं डेटाबेस में देखता हूं:

SINGER_ID   SINGER_NAME
1           Ricky Martin
2           Madonna
3           Elvis Presley
4           Luciano Pavarotti

अब एक रिकॉर्ड का उपयोग कर अद्यतन करें merge()

SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();

यह वही है जो मैं डेटाबेस में देखता हूं:

SINGER_ID   SINGER_NAME
1           Ricky Martin
2           Luciano Pavarotti
3           Elvis Presley

7
Javadoc बहुत स्पष्ट है कि वे क्या करते हैं, और क्या अंतर हैं। क्या आपने इसे पढ़ा और समझा है?
स्केफमैन


जवाबों:


144

JPA विनिर्देश में इन ऑपरेशनों के शब्दार्थों का बहुत सटीक वर्णन है, जो कि javadoc से बेहतर है:

एक एक्स के लिए लगाए गए निरंतर ऑपरेशन के शब्दार्थ इस प्रकार हैं:

  • यदि X एक नई इकाई है, तो यह प्रबंधित हो जाता है। निकाय X को डेटाबेस में या लेन-देन से पहले या फ्लश ऑपरेशन के परिणामस्वरूप दर्ज किया जाएगा।

  • यदि X एक preexisting प्रबंधित इकाई है, तो इसे फ़िनिश ऑपरेशन द्वारा अनदेखा किया जाता है। हालाँकि, एक्सिस द्वारा संदर्भित संस्थाओं के लिए लगातार ऑपरेशन का उपयोग किया जाता है, यदि एक्स से इन अन्य संस्थाओं के संबंधों को एनोटेशन तत्व मान के साथ एनोटेट किया जाता है cascade=PERSISTया cascade=ALLसमकक्ष XML डिस्क्रिप्टर तत्व के साथ निर्दिष्ट किया जाता है।

  • यदि X एक निकाय निकाय है, तो यह प्रबंधित हो जाता है।

  • यदि एक्स एक अलग वस्तु है, तो EntityExistsExceptionजब निरंतर ऑपरेशन का आह्वान किया जाता है, तो उसे फेंक दिया जा सकता है , EntityExistsExceptionया किसी अन्य PersistenceExceptionको फ्लश या प्रतिबद्ध समय पर फेंक दिया जा सकता है।

  • सभी संस्थाओं के लिए Y को X से एक रिश्ते द्वारा संदर्भित किया जाता है, यदि Y के रिश्ते को कैस्केड तत्व मान के साथ एनोटेट किया गया है cascade=PERSISTया cascade=ALL, दृढ़ता ऑपरेशन वाई पर लागू होता है।


एक इकाई X पर लागू मर्ज ऑपरेशन के शब्दार्थ इस प्रकार हैं:

  • यदि X एक अलग इकाई है, तो X की स्थिति को उसी पहचान के पूर्व-मौजूदा प्रबंधित निकाय उदाहरण X 'पर कॉपी किया जाता है या X की एक नई प्रबंधित प्रतिलिपि X' बनाई जाती है।

  • यदि X एक नई इकाई उदाहरण है, तो एक नया प्रबंधित निकाय उदाहरण X 'बनाया गया है और X की स्थिति को नए प्रबंधित निकाय उदाहरण X' में कॉपी किया गया है।

  • यदि X निकाले गए निकाय का उदाहरण है, IllegalArgumentExceptionतो मर्ज ऑपरेशन द्वारा फेंक दिया जाएगा (या लेनदेन प्रतिबद्ध विफल हो जाएगा)।

  • यदि X एक प्रबंधित इकाई है, तो इसे मर्ज ऑपरेशन द्वारा अनदेखा किया जाता है, हालांकि, मर्ज कार्रवाई को X से रिश्तों द्वारा संदर्भित संस्थाओं के लिए कैस्केड किया जाता है यदि इन संबंधों को कैस्केड तत्व मान cascade=MERGEया cascade=ALLएनोटेशन के साथ एनोटेट किया गया है ।

  • सभी संस्थाओं के लिए Y द्वारा एक्स से रिश्तों द्वारा संदर्भित कैस्केड तत्व मान cascade=MERGEया cascade=ALL, वाई को पुन: विलय के रूप में वाई 'के रूप में विलय कर दिया गया है। X द्वारा संदर्भित ऐसे सभी Y के लिए, X 'का संदर्भ Y' पर सेट है। (ध्यान दें कि यदि X प्रबंधित किया जाता है तो X X के समान ऑब्जेक्ट है।)

  • यदि X किसी अन्य इकाई Y के सन्दर्भ में X 'में विलय की गई इकाई है, जहाँ cascade=MERGEया cascade=ALLनिर्दिष्ट नहीं है, तो X के समान एसोसिएशन का नेविगेशन Y के समान स्थिर पहचान के साथ प्रबंधित ऑब्जेक्ट Y' के संदर्भ में पैदावार देता है।


जानकारी के लिए धन्यवाद। मैं दोनों परिभाषाओं के शब्दार्थ देखता हूं। लेकिन सवाल उनके बीच मतभेदों को लेकर है। शायद persistबनाम के प्रत्येक अलग व्यवहार के लिए राज्यों और 2 उप-वर्गों की सूची प्रस्तुत करें merge?
एलिकएल्ज़िन-किलका

25

इससे आ रहा है JPA। बहुत ही सरल तरीके से:

  • persist(entity) पूरी तरह से नई संस्थाओं के साथ इस्तेमाल किया जाना चाहिए, उन्हें डीबी में जोड़ने के लिए (यदि इकाई पहले से ही डीबी में मौजूद है तो EntityExistsException थ्रो होगा)।

  • merge(entity) यदि इकाई को अलग किया गया था और बदला गया था, तो दृढ़ता के संदर्भ में इकाई को वापस रखने के लिए उपयोग किया जाना चाहिए।


क्या आप कृपया अपने स्पष्टीकरण में एक स्रोत जोड़ सकते हैं? धन्यवाद।
एलिकएल्ज़िन-किलाका

@ AlikElzin-kilaka ऐसी व्याख्या, जैसा कि मुझे याद है, मैंने "शुरुआत जावा ईई 7" पुस्तक में पाया है।
क्रिस्टियन

12

पर्सिस्ट को केवल नई संस्थाओं पर बुलाया जाना चाहिए, जबकि विलय का मतलब अलग-अलग संस्थाओं को फिर से जोड़ना है।

यदि आप असाइन किए गए जनरेटर का उपयोग कर रहे हैं, तो हठ के बजाय मर्ज का उपयोग करना अनावश्यक SQL कथन का कारण बन सकता है , इसलिए प्रदर्शन को प्रभावित कर रहा है।

इसके अलावा, प्रबंधित संस्थाओं के लिए मर्ज बुला भी एक गलती के बाद से प्रबंधित संस्थाओं स्वतः हाइबरनेट द्वारा प्रबंधित किया जाता है और उनके राज्य द्वारा डेटाबेस रिकॉर्ड के साथ सिंक्रनाइज़ है गंदा जाँच तंत्र पर हठ प्रसंग निस्तब्धता


1

सबसे महत्वपूर्ण अंतर यह है:

  • persistविधि के मामले में , यदि वह इकाई जिसे दृढ़ता के संदर्भ में प्रबंधित किया जाना है, तो पहले से ही दृढ़ता संदर्भ में मौजूद है, नए को अनदेखा किया जाता है। (कुछ नहीं हुआ)

  • लेकिन mergeविधि के मामले में , पहले से ही दृढ़ता के संदर्भ में प्रबंधित की जाने वाली इकाई को नई इकाई (अद्यतन) से बदल दिया जाएगा और इस अद्यतन इकाई की एक प्रति वापस आ जाएगी। (अब से इस लौटी इकाई पर कोई परिवर्तन किया जाना चाहिए, यदि आप दृढ़ता के संदर्भ में अपने परिवर्तनों को प्रतिबिंबित करना चाहते हैं)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.