2010-12-20 10 views
9

है, मुझे विभिन्न डेटाबेस के बीच स्विच करते समय बड़ी ऑब्जेक्ट्स (बीएलओबी) युक्त हाइबरनेट मैपिंग के बारे में एक अजीब समस्या है।हाइबरनेट, पोस्टग्रेस्क्ल: कॉलम "एक्स" टाइप ओड का है लेकिन अभिव्यक्ति प्रकार बाइट

@Lob 
private byte[] binaryData; 

क्षेत्र के ऊपर MySQL में और Oracle में एक बाइट सरणी क्षेत्र बनाता है, PostreSQL में हालांकि यह प्रकार OID के एक क्षेत्र पैदा करता है।

अब जब मैं इस क्षेत्र में यह अन्य डेटाबेस में ठीक काम करता है तक पहुँचने का प्रयास है, लेकिन PostgreSQL में यह निम्न त्रुटि

Column "binaryData" is of type oid but expression is of type bytea. 

तो मैं बस "@Lob" एनोटेशन, को दूर करने की कोशिश की के साथ विफल हो जो PostgreSQL के लिए समस्या का समाधान करेगा, हालांकि इस एनोटेशन के बिना MySQL में, हाइबरनेट प्रकार "tinyblob" का एक क्षेत्र बनाता है, जो हमारे ज्यादातर मामलों में छोटा है। और, जैसा कि हम एक से अधिक पर्यावरण में इस परियोजना का उपयोग करना चाहते हैं, स्विच करने के लिए दो अलग-अलग मैपिंग होने के लिए परेशान होना मुश्किल है।

क्या कोई एनोटेशन है जो postgreSQL को @Lob के साथ एनोटेट किए गए फ़ील्ड के लिए बाइट का उपयोग करने के लिए मजबूर करता है? या क्या यह किसी भी तरह से @ लॉब को छोड़ना और MySQL को एक बड़े डेटाटाइप के साथ आवंटित करने के लिए मजबूर करने के लिए कुछ और डाल सकता है क्योंकि यह @Lob का उपयोग करेगा?

मैं भी, इस

if (field is of type oid) 
    store it as oid 
else if (field is of type bytea) 
    store it as bytea 
else 
    // not storable 

की तरह एक समाधान और एक गेटर के रूप में ही है की कल्पना कर सकता यदि इस

संपादित की तरह करने के लिए एक रास्ता मौजूद है:

निम्नलिखित घोषणा काम कर रही है। यह OID के रूप में स्तंभ आबंटित करता है, लेकिन यह जानता है की दुकान और इस तरह के एक क्षेत्र

@Lob 
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType") 
private byte[] binaryFile; 

उत्तर

9

इस क्षेत्र मानचित्रण org.hibernate.dialect.PostgreSQLDialect में परिभाषित किया गया है और इस उपवर्गीकरण और उपयोग करने के लिए अपने अनुप्रयोग को कॉन्फ़िगर करके बदला जा सकता है से डेटा पुनः प्राप्त करने के लिए कैसे का उपयोग कर हाइबरनेट Postgres के साथ चलते समय संशोधित बोली।

उपवर्ग में प्रासंगिक जादू शायद super() के लिए एक कॉल के बाद अपने निर्माता में

registerColumnType(Types.BLOB, "bytea"); 

डाल करने के लिए है।

+1

हाय डॉन! आपके उत्तर के लिए धन्यवाद। मैंने इसे आजमाया, और यह ठीक काम करता है, हालांकि मुझे इस बीच एक साधारण समाधान मिला जो मैंने प्रश्न में जोड़ा था – Hons

0

मेरे लिए यह एक बार का मतलब हो सकता है "अपने postgres JDBC संस्करण वापस लौटने वापस 9.3-1101.jdbc4 करने के लिए नीचे"

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