2011-06-14 8 views
8

का उपयोग कर MySQL में ऑटो-वृद्धि प्राथमिक प्राथमिक मान कैसे प्राप्त करें I MySQL तक पहुंचने के लिए हाइबरनेट का उपयोग कर रहा हूं, और मेरे पास एक ऑटो-वृद्धि प्राथमिक कुंजी वाला एक टेबल है।हाइबरनेट

हर बार जब मैं तालिका में एक पंक्ति डालता हूं तो मुझे प्राथमिक कुंजी निर्दिष्ट करने की आवश्यकता नहीं होती है। लेकिन जब मैं एक नई पंक्ति डालता हूं, तो मैं तुरंत हाइबरनेट का उपयोग करके सापेक्ष प्राथमिक कुंजी कैसे प्राप्त कर सकता हूं?

या मैं बस ऐसा करने के लिए जेडीबीसी का उपयोग कर सकता हूं?

उत्तर

10

जब आप हाइबरनेट इकाई को सहेजते हैं, तो id संपत्ति आपके लिए आबादी होगी। तो अगर आप

MyThing thing = new MyThing(); 
... 

// save the transient instance. 
dao.save(thing); 

// after the session flushes, thing.getId() should return the id. 

है मैं वास्तव में लगभग हमेशा एक assertNotNull मेरी परीक्षणों में एक मौजूदा इकाई की आईडी पर यकीन है कि काम सहेजें बनाने के लिए करते हैं।

+0

होता है, भले ही लेन-देन के लिए प्रतिबद्ध नहीं है और सत्र अभी तक बंद नहीं है सकते हैं। – Ace

2

एक बार जब आप ऑब्जेक्ट को जारी रखते हैं, तो आपको getId() या जो भी आपका @ID कॉलम कॉल करने में सक्षम होना चाहिए, ताकि आप इसे अपनी विधि से वापस कर सकें। आप हाइबरनेट प्रथम स्तर के कैश को भी अमान्य कर सकते हैं और इसे फिर से ला सकते हैं।

हालांकि, पोर्टेबिलिटी के लिए, आप अनुक्रम शैली आईडी पीढ़ी के साथ हाइबरनेट का उपयोग करना चाहेंगे। यदि आपको कभी भी आवश्यकता हो तो यह संक्रमण को MySQL से दूर कर देगा। निश्चित रूप से, अगर आप जनरेटर की इस शैली का उपयोग करें, आप आईडी तुरंत प्राप्त करने के लिए, क्योंकि हाइबरनेट स्तंभ मान को हल करने की जरूरत है सक्षम होने से पहले ही वस्तु बनी रहती हो जाएगा:

@Id 
@GeneratedValue (generator="MY_SEQ") 
@GenericGenerator(name = "MY_SEQ", 
    strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator", 
    parameters = { 
     @Parameter(name = "sequence_name", value = "MY_SEQ"), 
     @Parameter(name = "initial_value", value = "1"), 
     @Parameter(name = "increment_size", value = "10") } 
     ) 
@Column (name = "id", nullable = false) 
public Long getId() { 

     return this.id; 
    } 

यह थोड़ा और अधिक जटिल है, लेकिन यह है SEQUENCE नाम बदलने के अलावा, आप जिस प्रकार की कटौती और पेस्ट कर सकते हैं।

0

जब आप हाइबरनेट में एक सेव() विधि को कॉल कर रहे हैं, तो ऑब्जेक्ट तुरंत डेटाबेस पर नहीं लिखा जाता है। यह तब होता है जब आप डेटाबेस से पढ़ने की कोशिश करते हैं (उसी तालिका से?) या स्पष्ट रूप से फ्लश() को कॉल करें। जब तक कि संबंधित डेटाबेस डेटाबेस तालिका में सम्मिलित नहीं किया जाता है, MySQL इसके लिए एक आईडी आवंटित नहीं करेगा।

तो, आईडी उपलब्ध है, लेकिन इससे पहले कि हाइबरनेट वास्तव में MySQL तालिका में रिकॉर्ड डालने से पहले नहीं।

0

यदि आप चाहते हैं, तो आप अगले प्राथमिक कुंजी स्वतंत्र रूप से एक वस्तु का उपयोग करते हुए प्राप्त कर सकते हैं:

Session session = SessionFactoryUtil.getSessionFactory().getCurrentSession(); 
Query query = session.createSQLQuery("select nextval('schemaName.keySequence')"); 

Long key = (Long) query.list().get(0); 
return key; 
0

खैर ऑटो वेतन वृद्धि जनरेटर वर्ग के मामले में, जब हम save() विधि यह प्राथमिक कुंजी रिटर्न का उपयोग (यह मानते हुए इसकी id)। तो यह रिटर्न उस विशेष id, तो आप इस

int id = session.save(modelClass); 

करना और लौट id