2011-11-08 9 views
6

मैं Grails के लिए नया हूँ। मेरे पास मेरे डोमेन ऑब्जेक्ट में एक फ़ील्ड है जिसे मैं String के रूप में परिभाषित करता हूं।grails में आईडी के अलावा ऑटो इंक्रुमेंट फ़ील्ड

String ponum 

जब मैं पृष्ठ बनाने पर पहली बार क्लिक करें, "ponum" क्षेत्र 0001 प्रदर्शित करने के लिए है और बाद में इसे जब मैं दूसरी बार "ponum" क्षेत्र 0002 प्रदर्शित करने के लिए है पर क्लिक करें database.And में बचाने के लिए है और बाद में इसे डेटाबेस में सहेजना होगा। हर बार जब मैं पेज "पोनम" फ़ील्ड पर क्लिक करता हूं तो उसे ऑटोइनक्रिकमेंट करना होगा और इसे डेटाबेस सेव करना होगा। मैं google, लेकिन मुझे कोई दस्तावेज़ नहीं मिला। धन्यवाद

+1

संस्करण क्षेत्र (जो स्वचालित रूप से grails द्वारा जोड़ा जाता है) यह भी बताता है कि कितनी बार पंक्ति अद्यतन किया गया है। जब भी पंक्ति अपडेट हो जाती है तो Grails स्वचालित रूप से इसे बढ़ाता है, इसलिए यदि आप यह सब कुछ ढूंढ रहे हैं, तो यह आपके लिए काम कर सकता है। – Todd

उत्तर

6

बातें (अपने मानक आईडी genaerator के साथ एक नियमित RDBMS का उपयोग कर यह मानते हुए कि) वैसे भी एक आईडी मिल के रूप में, क्यों न सिर्फ एक वैरिएबल ponum है जो आईडी पर आधारित है?

बस अपने डोमेन वर्ग के लिए एक गेटर जोड़ें:

class Page { 
    String getPonum() { 
    String.format("%04d", id) 
    } 
} 
+0

उत्तर के लिए धन्यवाद मेरे लिए यह काम कर रहा है। लेकिन जब मैं पेज बनाने पर क्लिक करता हूं तो यह "शून्य" दिखा रहा है। इसके बजाय मुझे पेज बनाने में नया पोनम दिखाने की ज़रूरत है। –

+0

@ सतीश कुमार आह ... आईडी तब तक नहीं बनाई गई जब तक कि इसे पहले सहेजा नहीं जाता ... आप इसे बदल सकते हैं: आईडी? String.format ("% 04d", id): सहेजे जाने से पहले उपयोगकर्ता को कुछ दिखाने के लिए 'सहेजा नहीं गया', या 'अनुक्रम' जैसे कुछ का उपयोग करें यदि आपका (डेटाबेस उनका समर्थन करता है)। हालांकि इसका मतलब यह होगा कि 'पेज बनाएं' पर क्लिक करने से बहुत सारे नए 'पोनम' बन जाएंगे जो इसे डेटाबेस में कभी नहीं बना सकते हैं –

1

this answer के अनुसार, ऐसा करने के लिए हाइबरनेट जेनरेटर (आईड्स के लिए उपयोग किए जाने वाले) का उपयोग करना संभव नहीं है। यदि आपको वास्तव में हाइबरनेट जेनरेटर का उपयोग करने की आवश्यकता है, तो उत्तर में एक वर्कअराउंड भी वर्णित है।

आपके मामले में, आप जब एक नई वस्तु डालने अपने ponum संपत्ति जनरेटर के लिए एक इंटरसेप्टर इस्तेमाल कर सकते हैं:

class Yours { 
    int ponum 

    def beforeInsert() { 
    def lastPonum = Book.list([sort: 'ponum', order:'desc', max: 1]) 
    if(lastPonum) 
     ponum = (lastPonum.pop().ponum as int) + 1 as String 
    else 
     ponum = '0' 
    } 
} 
+3

यह उत्तर थ्रेड-सुरक्षित नहीं है। यदि आपके पास दो धागे एक साथ सम्मिलित करते हैं, तो वे दोनों एक ही पोनम प्राप्त करेंगे। – mmigdol

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