হাইবারনেট ৩.১ এবং জেপিএ টিকা ব্যবহার করে আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে। এটিতে বাইট [] বৈশিষ্ট্য (1 কে - 200 কে আকারে) সহ কয়েকটি অবজেক্ট রয়েছে। এটি জেপিএ @ লব টীকাগুলি ব্যবহার করে এবং হাইবারনেট ৩.১ এ সমস্ত বড় ডেটাবেসগুলিতে কেবল সূক্ষ্মভাবে পড়তে পারে - এটি জেডিবিসি ব্লব বিক্রেতার অদ্ভুততাগুলি (যেমন এটি করা উচিত) গোপন করে বলে মনে হয়।
@Entity
public class ConfigAttribute {
@Lob
public byte[] getValueBuffer() {
return m_valueBuffer;
}
}
আমাদের ৩.৫-এ উন্নীত করতে হয়েছিল, যখন আমরা আবিষ্কার করেছি যে হাইগ্রনেট ৩.৫ ব্রেক (এবং ঠিক করবে না) পোস্ট টেরিএসকিএলে এই টীকা সংমিশ্রণ (কোনও কর্মশালা ছাড়াই)। আমি এখন পর্যন্ত একটি পরিষ্কার সমাধান খুঁজে পাইনি, তবে আমি লক্ষ্য করেছি যে আমি যদি কেবলমাত্র @ লবটি সরিয়ে ফেলি তবে এটি পোস্টগ্র্যাস্কল টাইপ বাইটা ব্যবহার করে (যা কেবল পোস্টগ্র্যাসে কাজ করে)।
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.
আমি একটি একক টীকাযুক্ত ক্লাস (একটি ব্লব সম্পত্তি সহ) রাখার উপায় খুঁজছি যা প্রধান ডাটাবেসগুলিতে বহনযোগ্য।
- বাইট [] সম্পত্তি বর্ণনা করার পোর্টেবল উপায় কী?
- হাইবারনেটের সাম্প্রতিক সংস্করণে এটি কি ঠিক করা হয়েছে?
আপডেট: এই ব্লগটি পড়ার পরে আমি শেষ পর্যন্ত জিরার ইস্যুতে মূল কাজটি কী তা বুঝতে পেরেছিলাম: সম্ভবত আপনি @ লবকে ছেড়ে সম্পত্তিটি এটিকে টিকা দেবেন বলে মনে করা হচ্ছে:
@Type(type="org.hibernate.type.PrimitiveByteArrayBlobType")
byte[] getValueBuffer() {...
তবে এটি আমার পক্ষে কাজ করে না - আমি এখনও বাইটিয়ার পরিবর্তে ওআইডি পাই; তবে এটি JIRA ইস্যুটির লেখকের পক্ষে কাজ করেছে, যাকে মনে হয় তারা মদদ চেয়েছিল।
এ। গার্সিয়া থেকে উত্তর দেওয়ার পরে, আমি তখন এই কম্বোটি চেষ্টা করেছিলাম, যা আসলে পোস্টগ্রেস্কল-এ কাজ করে তবে ওরাকলে নয়।
@Type(type="org.hibernate.type.BinaryType")
byte[] getValueBuffer() {...
আমাকে যা করতে হবে তা হ'ল নিয়ন্ত্রণ করা যা কোন @ org.hibernate.annotations. কম্বিনেশনটি (@ লব + বাইট [] ম্যাপ করা যায়) থেকে (পোস্টগ্রেস্কএল) টাইপ করুন।
এখানে 3.5.5 থেকে স্নিপেট রয়েছে Material স্টিভের ব্লগ অনুসারে, পোস্টগ্র্যাস্কেল চায় যে আপনি বাইটিয়া (আমাকে কেন জিজ্ঞাসা করবেন না) এবং পোস্টগ্রাএসকিএল-এর কাস্টম ব্লব টাইপের জন্য ওডস ব্যবহার করুন। জেডিবিসি-তে সেটবিটস () ব্যবহার করাও বাইটিয়া (অতীতের অভিজ্ঞতা থেকে) for সুতরাং এটি ব্যাখ্যা করে যে ব্যবহার-স্ট্রিমগুলির কোনও প্রভাব নেই কেন তারা উভয়ই 'বাইটিয়া' ধরে নেয়।
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
আপডেট পরবর্তী যুক্তিযুক্ত প্রশ্নটি হল: "কেবলমাত্র টেবিলের সংজ্ঞাগুলি বাইটায় কেন ম্যানুয়ালি পরিবর্তন করবেন না" এবং (@ লব + বাইট []) রাখবেন? এই করে কাজ, পর্যন্ত আপনি একটি নাল বাইট [] সঞ্চয় করতে চেষ্টা করুন। যা পোস্টগ্রাইএসকিউএল ড্রাইভার মনে করে যে এটি একটি ওআইডি টাইপ এক্সপ্রেশন এবং কলামের ধরণটি বাইটিয়া - এটি হিজারনেট (সঠিকভাবে) জেডিসি.সেটবাইটকে (নাল) কল করে যা পিজি ড্রাইভার আশা করে।
ERROR: column "signature" is of type bytea but expression is of type oid
হাইবারনেটে টাইপ সিস্টেমটি বর্তমানে একটি 'কাজ চলছে' (৩.৫.৫ হ্রাস মন্তব্য অনুসারে)। প্রকৃতপক্ষে 3.5.5.5 কোডের অনেকটাই হ্রাস করা হয়েছে, PostgreSQLDialect উপ-শ্রেণিবদ্ধকরণের সময় কী দেখতে হবে তা জানা শক্ত)।
আফাক্ট, প্রকারভেদ.বিএলবিও / 'ওড' পোস্টগ্র্যাস্কল-এ কিছু কাস্টম টাইপের সাথে ম্যাপ করা উচিত যা OID স্টাইল JDBC অ্যাক্সেস (যেমন PostgresqlBlobType অবজেক্ট এবং নট মেট্রালাইজডব্লব টাইপ) ব্যবহার করে। আমি আসলে পোস্টগ্র্রেসকিএল দিয়ে ব্লবগুলি কখনই সফলভাবে ব্যবহার করতে পারি নি, তবে আমি জানি যে বাইটিয়া কেবল একটি / আমি প্রত্যাশার মতো কাজ করে।
আমি বর্তমানে BatchUpdateException এ দেখছি - এটি সম্ভবত সম্ভব যে ড্রাইভার ব্যাচিং সমর্থন করে না।
২০০৪ সালের দুর্দান্ত উক্তি: "আমার দুর্বৃত্তদের সংক্ষিপ্তসার হিসাবে, আমি বলতে পারি যে তারা হাইবারনেট পরিবর্তনের আগে জেডিবিসি ড্রাইভারকে সঠিকভাবে এলওবি করার জন্য অপেক্ষা করা উচিত।"
তথ্যসূত্র:
- 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/