How to map mysql table to Grails domain class? -


मेरे पास mysql तालिका anto2 है जिसमें केवल एक कॉलम नाम का varchar 100 है। मैं इस मेज को Grails डोमेन वर्ग में मैप करने की कोशिश की:

  class Anto {String grailsName static constraints = {} स्थिर मानचित्रण = {table 'anto2' grailsName स्तंभ: 'name'}}   

मैंने रन-ऐप किया था, मैं देख सकता हूं कि मेरी तालिका दो और कॉलम के साथ जोड़ दी गई है:

  + ----- ---- + -------------- + ------ + ----- + --------- + ------- + | फील्ड | प्रकार | नल | कुंजी | डिफ़ॉल्ट | अतिरिक्त | + --------- + -------------- + ------ + ----- + --------- + - ------ + | नाम | Varchar (100) | हां | | नल | | | आईडी | बिल्टीन्ट (20) | नहीं | | नल | | | संस्करण | बिल्टीन्ट (20) | नहीं | | नल | | + --------- + -------------- + ------ + ----- + --------- + - ------ +   

मैंने इस डोमेन वर्ग के लिए स्थिर दृश्य और नियंत्रक उत्पन्न किया और जब मैंने इसे सहेजने की कोशिश की तो मुझे अपने save () विधि (जो कि जनरेट-सभी कमांड का उपयोग करके उत्पन्न होती है)। त्रुटि निम्नानुसार है:

  2012-07-09 23: 05: 26,391 [http-bio-8080-exec-2] त्रुटि त्रुटियां .ग्रेल्स अपवाद रिसेल्वर - अनुरोध की प्रक्रिया करते समय SQLException हुआ: [POST ] / Mysql / anto / save-parameter: create: फ़ील्ड 'id' को एक डिफ़ॉल्ट मान नहीं है। स्टैकट्र्रेस निम्नानुसार है: संदेश: फ़ील्ड 'आईडी' में कोई डिफ़ॉल्ट मान नहीं है Line | विधि - & gt; & gt; 1073 | Com.mysql.jdbc.SQLError में बनाओ एसक्यूएलक्सेप्शन - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - | 35 9 7 | Com.mysql.jdbc.MysqlIO में जांचएयरपैकेट | 3529 | चेकएयर-पैकेट '' | में 1 99 0 | भेजें '' में | '' | 2151 | SqlQueryDirect । '' | में 2625 | Com.mysql.jdbc.ConnectionImpl | में execSQL 2119 | ExecuteInternal Com.mysql.jdbc.PreparedStatement | में | 2415 | ExecutionUpdate '' | | में 2333 | ExecuteUpdate । '' | में 2318 | ExecutionUpdate '' | | में 105 | ExecuteUpdate । में org.apache.commons.dbcp.DelegatingPreparedStatement | 25 | एमएनएम में सहेजें। एंटो कंट्रोलर | 1110 | रनवॉकर । । । Java.util.concurrent.ThreadPoolExecutor में | 603 | Java.util.concurrent.ThreadPoolExecutor $ Worker ^ 722 | में चलें भागो । । । । । । में java.lang.Thread   

ऐसा क्यों होता है? जहां आप गलत थे?

यदि आप अपनी तरह का आईडी जनरेटर निर्दिष्ट नहीं करते, तो GORM अपने डेटाबेस की मूल रणनीति। यदि आप mysql को डीबी के रूप में उपयोग कर रहे हैं, तो यह आपकी आईडी बनाने के लिए आईडीटीटी रणनीति का उपयोग करके उन्हें बनाएगा। इस रणनीति के लिए आपके आईडी कॉलम पर एक स्वत: वृद्धि होने की आवश्यकता है।

हालांकि मुझे लगता है कि रणनीति को परिभाषित करना बेहतर है आप SEQUENCE रणनीति का उपयोग कर सकते हैं:

  आईडी स्तंभ: 'id_anto2', जनरेटर: 'अनुक्रम', पैरामीटर: [अनुक्रम: 'tab_anto2_seq']   

और उसके बाद अपने डेटाबेस में एक ही नाम के साथ एक अनुक्रम बनाएँ (ताकि आपको एक हाइबरनेट का उपयोग स्वचालित रूप से करने के लिए नहीं करना पड़ता)। यह बहुत आसान है और एक जादू की तरह काम करता है।

इसके अलावा, संस्करण फ़ील्ड को त्यागने के लिए, अपने मैपिंग ब्लॉक में संस्करण गलत डालें। तो, यह ऐसा होगा:

  स्थिर मानचित्रण = {तालिका 'एंटो' आईडी स्तंभ: 'id_anto2', जनरेटर: 'अनुक्रम', पैरामीटर: [अनुक्रम: 'tab_anto2_seq'] grailsName स्तंभ: 'नाम' संस्करण झूठा}    

Comments