2011-11-17 16 views
6

See this questionजेपीए/प्ले में लेनदेन करने से पहले किसी इकाई को आईडी कैसे प्राप्त होती है?

यह पता चला है कि लेनदेन करने से पहले, मैन्युअल रूप से लेनदेन करने के बिना, व्यक्ति को सहेजने() विधि को कॉल करने के बाद एक आईडी है।

डेटाबेस फ़ील्ड को assinging के लिए जिम्मेदार डेटाबेस नहीं है? यदि हां, तो प्रतिबद्ध होने से पहले आईडी फ़ील्ड कैसे भर सकता है? क्या डीबी के साथ कोई संचार TX से पहले होता है?

उत्तर

9

हां, जेपीए को लेनदेन प्रतिबद्धता से पहले डीबी के साथ संवाद करने की अनुमति है। यह तब हो सकता है जब आप स्पष्ट रूप से EntityManager#flush() का आह्वान करते हैं।

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

कुछ स्वचालित आईडी जेनरेटर रणनीतियों को पीके मान प्राप्त करने के लिए डेटाबेस को हिट करना होगा (जहां तक ​​मुझे IDENTITY रणनीति उस तरह से काम करती है)।
इसके विपरीत, TABLE या SEQUENCE जेनरेटर को आईडी मान प्राप्त करने के लिए डीबी को हिट करने की आवश्यकता नहीं है। वे पैरामीटर का उपयोग बैच आईडी के लिए डीबी टेबल या SEQUENCE से पूछने के लिए करते हैं जो डेटाबेस के साथ और संचार के बिना नई इकाइयों को दिया जाएगा।

3

Play! दृढ़ता संदर्भ को फ्लश कर रहा है (जो डेटाबेस में परिवर्तन लिखता है और इसे जेनरेट आईडी प्राप्त करने की अनुमति देता है) हर बार जब आप मॉडल पर सेव() विधि का उपयोग कर ऑब्जेक्ट को सहेजते हैं:

JPABase._save() स्रोत कोड से :

if (!em().contains(this)) { 
    em().persist(this); 
    PlayPlugin.postEvent("JPASupport.objectPersisted", this); 
} 
// ... 
try { 
    em().flush(); 
} catch (PersistenceException e) { 
    // ... 
} 
0

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

+0

क्यों? जेपीए इसका ख्याल रखता है ... और अगर किसी भी मौके से लेनदेन करने पर आईडी उपलब्ध नहीं होगी, तो यह असफल हो जाएगा ... जब तक आप जानते हों कि लेनदेन विफल हो सकता है (किसी भी कारण से), मुझे लगता है कि आईडी का उपयोग जल्दी ठीक है। – ripper234

0
begintransaction और commit Between

, call save or update method after, आप का उपयोग should:

EntityManagerHelper.getEntityManager().flush(); 

आप dont If यह call, Object lost जा जाएगा और cant DB को save होना।

तो इसे कॉल करने के बाद, आप इसे ऑब्जेक्ट में ले लेंगे।

संबंधित मुद्दे