2012-04-27 24 views
5

के साथ ओरेकल 10 जी सीएलओबी का उपयोग करना मैं ओरेकल 10 जी और ग्रेल्स v2.0.1 का उपयोग कर एक प्रोजेक्ट पर काम कर रहा हूं।ग्रेल्स 2.0.1

मैं अपने डोमेन वर्ग में एक टेक्स्ट इनपुट फ़ील्ड के लिए एक सीएलओबी डेटा प्रकार का उपयोग करने की कोशिश कर रहा हूं, और ऐसा लगता है कि यह काम नहीं कर रहा है। मेरा पहला प्रयास है कि मैं क्या here about GORM पढ़ पर आधारित थी, जहां है type: 'text' उपयोग करने के लिए, इस उदाहरण की तरह कहते हैं:

class Address { 
    String number 
    String postCode 
    static mapping = { 
     postCode type: 'text' 
    } 
} 

Grails मैप किया गया है कि मेरे DB में एक LONG डेटा प्रकार, जो not desirable

2 प्रयास है करने के लिए type: 'clob' आज़माएं। यह मेरी डीबी डेटाटाइप को सीएलओबी होने में प्रभावी था, लेकिन इसके परिणामस्वरूप क्लास कास्ट त्रुटि हुई क्योंकि संपत्ति को स्वयं स्ट्रिंग के रूप में परिभाषित किया गया था, यानी String postCode। (ध्यान दें कि मैं दस्तावेज में type:'clob' कभी नहीं देखा है, लेकिन मैं बोली क्लास से निकाल सकता है कि clob वहाँ एक मान्य इनपुट हो सकता है)

मैं बाद में, एक java.sql.Clob के रूप में संपत्ति को परिभाषित यानी Clob postCode; की कोशिश की, और कहा कि didn ' बिल्कुल काम नहीं करते। कोई त्रुटि संदेश नहीं, लेकिन डीबी को कुछ भी जारी नहीं किया जा रहा था।

मैं Clob दृष्टिकोण रखते हुए, लेकिन एक क्षणिक String संपत्ति है, जिसमें getters/setters लगातार CLOB क्षेत्र के लिए क्षणिक स्ट्रिंग मान मैप करने के लिए प्रयास का उपयोग करने का एक अंतिम कदम उठाया। लेकिन मैं यह नहीं समझ सकता कि क्लॉब में अपना स्ट्रिंग वैल्यू कैसे प्राप्त करें। Grails एक त्रुटि फेंक नहीं है, लेकिन मेरे प्रयास किए गए असाइनमेंट के बाद println() कभी प्रिंट नहीं करता है। मैंने असाइनमेंट करने के लिए myClob.setString(1, theString) का उपयोग करने का प्रयास किया है, लेकिन बिना किसी सफलता के।

इसलिए एक लंबी कहानी कम करने के लिए, मैं अपने परिदृश्य में क्लॉब का उपयोग नहीं कर सकता, और मुझे आश्चर्य है कि किसी और ने इसे देखा है और इसे दूर करने में सक्षम है। यदि हां, तो क्या आप मुझे बता सकते हैं कि मैं गलत क्या कर सकता हूं?

या ... क्या डेटाटाइप Grails को ओवरराइड करने का कोई तरीका है जैसे कि मैं postCode type: 'text' को CLOB पर मैप करने के लिए मजबूर कर सकता हूं? मैं हाइबरनेट के साथ कुशल नहीं हूं, इसलिए मुझे यकीन नहीं है कि अगर कोई रास्ता है तो इसके बारे में कैसे जाना है।

साइड नोट: Grails 1.3.7 से 2.0.1 तक हमारे अपग्रेड से पहले, मुझे पूरा यकीन है कि type: 'text' वास्तव में, ओरेकल में एक सीएलओबी के लिए मानचित्र किया गया था। तो यह 2.0.1 के लिए नया हो सकता है।

+0

खैर (http://grails.org/doc/2.0.x/ref/Database%20Mapping/type.html) वास्तव में अपने मामले में उस प्रकार लिखा है CLOB होगा, लेकिन मुझे अभी तक इसका उपयोग नहीं करना पड़ेगा, इसलिए मैं आश्वस्त नहीं कर सकता कि यह 2.0.x –

उत्तर

11

I सोचें मुझे Custom Hibernate Types पर प्रलेखन में एक उत्तर मिला।

उस मामले में, sqlType विशेषता

यह काम कर रहा है का उपयोग कर स्तंभ के एसक्यूएल प्रकार ओवरराइड।

ऐसा लगता है कि जावा का प्रकार स्ट्रिंग रखने के दौरान मैं अपने डीबी प्रकार को सीएलओबी होने के लिए मजबूर करने में सक्षम हूं। दूसरे शब्दों में, शायद type फ़ील्ड को संभालने के लिए एक डीबी प्रकार और जावा प्रकार दोनों चुनता है? लेकिन sqlType उपयोग करने के लिए डीबी प्रकार निर्दिष्ट करने के लिए थोड़ा और ग्रैन्युलरिटी देता है।

तो ऊपर नमूना डोमेन वर्ग मेरे मामले में इस तरह दिखना चाहिए:

class Address { 
    String number 
    String postCode 
    static mapping = { 
     postCode sqlType: 'clob' 
    } 
} 

मैं विषय पर एक और StackOverflow सवाल से gleaned (सवाल ही मुझे, में clued जबकि स्वीकार किए जाते हैं जवाब मुझे गुमराह किया!):

मैं एक दिन बिताया यह सब पता लगाने की कोशिश, और यह अविश्वसनीय रूप से FRU था strating। तो शायद यहां विषय पर मेरे नोट किसी और को उस अनुभव से बचने में मदद करेंगे!


और जब मैं यहां नोट रखने हूँ ... इस पोस्ट कैसे मेरे मैपिंग में अधिक विशिष्ट प्राप्त करने के लिए समस्या निवारण के संदर्भ में कुछ हद तक उपयोगी साबित हुआ:

दिलचस्प उस से कोड यहां पुन: उत्पन्न होता है:

//CONFIG.GROOVY (maps a custom SixDecimal type) 
grails.gorm.default.mapping = { 
    'user-type'(type: SixDecimalUserType, class: SixDecimal) 
} 
+0

पर काम कर रहा है! यह सही ढंग से स्ट्रिंग> 4000 वर्णों को सम्मिलित करता है और पुनर्प्राप्त करता है। – Tobia

1

प्रोबा Bly बहुत देर हो चुकी है, लेकिन मैं इस समस्या का एक बहुत सरल समाधान मिल गया है:, और

class MyDomain{ 
    String myField 
    ... 
    static mapping = {  
    myField type:'materialized_clob'   
    } 
} 

कुछ भी नहीं की आवश्यकता है लिखते हैं और आकर्षण की तरह काम करता है पढ़ता है! : डी

उम्मीद है कि यह मदद करता है। इवान।

0

इवान का जवाब मेरे लिए काम करता है। MaterializedClob जावा स्ट्रिंग के लिए हाइबरनेट जेडीबीसी प्रकार है।

[2.0.x डॉक्स] में
संबंधित मुद्दे