मेरे पास हाइबरनेट 3.1 और जेपीए एनोटेशन का उपयोग करने वाला एक एप्लिकेशन है। इसकी बाइट के साथ कुछ वस्तुएं हैं [] विशेषताएँ (1k - 200k आकार में)। यह JPA @Lob एनोटेशन का उपयोग करता है, और हाइबरनेट 3.1 सभी प्रमुख डेटाबेस पर इन्हें ठीक पढ़ सकता है - यह JDBC ब्लॉब विक्रेता विशिष्टताओं को छिपाने के लिए लगता है (जैसा कि यह करना चाहिए)।
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
हमें 3.5 में अपग्रेड करना पड़ा, जब हमें पता चला कि हाइबरनेट 3.5 टूटता है (और ठीक नहीं होगा) पोस्टग्रैसक्ल में यह एनोटेशन संयोजन (बिना वर्कअराउंड के)। मुझे अब तक स्पष्ट रूप से ठीक नहीं मिला है, लेकिन मैंने नोटिस किया है कि अगर मैं सिर्फ @ लोब को हटाता हूं, तो यह पोस्टग्रेजल टाइप बाइटा का उपयोग करता है (जो काम करता है, लेकिन केवल पोस्टग्रेज पर)।
annotation postgres oracle works on
-------------------------------------------------------------
byte[] + @Lob oid blob oracle
byte[] bytea raw(255) postgresql
byte[] + @Type(PBA) oid blob oracle
byte[] + @Type(BT) bytea blob postgresql
once you use @Type, @Lob seems to not be relevant
note: oracle seems to have deprecated the "raw" type since 8i.
मैं एक एकल एनोटेट वर्ग (एक ब्लॉब प्रॉपर्टी के साथ) का रास्ता खोज रहा हूं जो प्रमुख डेटाबेस में पोर्टेबल है।
- एक बाइट [] संपत्ति को एनोटेट करने का पोर्टेबल तरीका क्या है?
- क्या यह हाइबरनेट के कुछ हालिया संस्करण में तय किया गया है?
अद्यतन: इस ब्लॉग को पढ़ने के बाद मैंने आखिरकार यह पता लगा लिया है कि JIRA मुद्दे में मूल वर्कअराउंड क्या था: जाहिरा तौर पर आपको @Lob को छोड़ना होगा और संपत्ति को एनोटेट करना होगा:
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
हालांकि, यह मेरे लिए काम नहीं करता है - मैं अभी भी बाइट के बजाय ओआईडी प्राप्त करता हूं; हालांकि इसने JIRA मुद्दे के लेखक के लिए काम किया, जो ओईद चाहते थे।
ए। गार्सिया के जवाब के बाद, मैंने फिर इस कॉम्बो की कोशिश की, जो वास्तव में पोस्टग्रैस्कल पर काम करता है, लेकिन ओरेकल पर नहीं।
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
मुझे वास्तव में क्या करने की आवश्यकता है जो नियंत्रित करता है जो @ org.hibernate.annotations.Type संयोजन (@Lob + बाइट [] मैप हो जाता है) से (पोस्टग्रैसेकल पर)।
यहाँ 3.5.5 से स्निपेट है। MaterializedBlobType (sql type Blob) से। स्टीव के ब्लॉग के अनुसार, postgresql चाहता है कि आप धाराओं का उपयोग bytea के लिए करें (मुझसे क्यों न पूछें) और ogresql के कस्टम ब्लॉब प्रकार को oids के लिए पोस्ट करें। यह भी ध्यान दें कि JDBC पर setBytes () का उपयोग करना भी bytea (पिछले अनुभव से) के लिए है। तो यह बताता है कि क्यों उपयोग-धाराओं का कोई प्रभाव नहीं पड़ता है कि वे दोनों 'बायटिया' मान लेते हैं।
public void set(PreparedStatement st, Object value, int index) {
byte[] internalValue = toInternalFormat( value );
if ( Environment.useStreamsForBinary() ) {
// use streams = true
st.setBinaryStream( index,
new ByteArrayInputStream( internalValue ), internalValue.length );
}
else {
// use streams = false
st.setBytes( index, internalValue );
}
}
इसका परिणाम यह होगा:
ERROR: column "signature" is of type oid but expression is of type bytea
अद्यतन अगला तार्किक प्रश्न है: "क्यों न केवल तालिका परिभाषाओं को मैन्युअल रूप से बाइटी में बदलें" और (@Lob + बाइट []) रखें? यह काम करता है , UNTIL आप एक सुस्त बाइट [] को स्टोर करने का प्रयास करते हैं। जो पोस्टग्रेसीएल चालक सोचता है कि यह एक ओआईडी प्रकार की अभिव्यक्ति है और कॉलम प्रकार बाइटा है - इसका कारण यह है कि हाइबरनेट (सही तरीके से) JDBC.setNull () के बजाय JDBC.setBytes (नल) को कॉल करता है जो PG ड्राइवर की अपेक्षा करता है।
ERROR: column "signature" is of type bytea but expression is of type oid
हाइबरनेट में प्रकार प्रणाली वर्तमान में 'कार्य प्रगति पर है' (3.5.5 पदावनति टिप्पणी के अनुसार)। वास्तव में 3.5.5 कोड में से बहुत कुछ हटा दिया गया है, यह जानना मुश्किल है कि पोस्टग्रेक्यूएलडायल को उप-वर्गीकृत करते समय क्या देखना है।
AFAKT, Types.BLOB / 'oid' को postgresql पर कुछ कस्टम प्रकार से मैप किया जाना चाहिए जो OID स्टाइल JDBC एक्सेस (यानी PostgresqlBlobType ऑब्जेक्ट और NOT MaterializedBlobbype) का उपयोग करता है। मैंने वास्तव में कभी भी ब्लब्स को पोस्टग्रेजेकल के साथ सफलतापूर्वक इस्तेमाल नहीं किया है, लेकिन मुझे पता है कि बाइटिया बस एक के रूप में काम करता है / मैं उम्मीद करूंगा।
मैं वर्तमान में BatchUpdateException को देख रहा हूं - यह संभव है कि ड्राइवर बैचिंग का समर्थन न करे।
2004 के महान उद्धरण: "मेरी रम्बलिंग का योग करने के लिए, मैं कहूंगा कि हमें Hibernate को बदलने से पहले JDBC ड्राइवर के लिए LOB को ठीक से करने के लिए इंतजार करना चाहिए।"
संदर्भ:
- https://forum.hibernate.org/viewtopic.php?p=2393203
- https://forum.hibernate.org/viewtopic.php?p=2435174
- http://hibernate.atlassian.net/browse/HHH-4617
- http://postgresql.1045698.n5.nabble.com/Migration-to-Hibernate-3-5-final-td2175339.html
- https://jira.springframework.org/browse/SPR-2318
- https://forums.hibernate.org/viewtopic.php?p=2203382&sid=b526a17d9cf60a80f13d40cf8082aafd
- http://virgo47.wordpress.com/2008/06/13/jpa-postgresql-and-bytea-vs-oid-type/