বাইট জন্য সঠিক হাইবারনেট টিকা []


120

হাইবারনেট ৩.১ এবং জেপিএ টিকা ব্যবহার করে আমার কাছে একটি অ্যাপ্লিকেশন রয়েছে। এটিতে বাইট [] বৈশিষ্ট্য (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 এ দেখছি - এটি সম্ভবত সম্ভব যে ড্রাইভার ব্যাচিং সমর্থন করে না।


২০০৪ সালের দুর্দান্ত উক্তি: "আমার দুর্বৃত্তদের সংক্ষিপ্তসার হিসাবে, আমি বলতে পারি যে তারা হাইবারনেট পরিবর্তনের আগে জেডিবিসি ড্রাইভারকে সঠিকভাবে এলওবি করার জন্য অপেক্ষা করা উচিত।"

তথ্যসূত্র:


এটি 3.6-এ স্থির করা হয়েছে বলে মনে হয়, 3.5.5 সম্পর্কে নিশ্চিত নয়; ম্যাটারিয়ালাইজড ব্লবটাইপ ক্লাসটি সম্পূর্ণ 3.5.5> 3.6 থেকে পুনরায় লেখা হয়েছিল। ওআইডি প্রকারটি কার্যকর হয়েছে কারণ তারা প্রয়োগ পরিবর্তন করেছে।
জাস্টিন

নিস! আমি অবাক হই যে জিরা ইস্যুটি এই পুনর্লিখনটি কীভাবে ট্র্যাক করছে, যদি কোনও (সম্ভবত পুনঃলিখনটি একটি গভীর পরিবর্তনের ফলাফল) is সম্ভব হলে 3.5 এর পরিবর্তনগুলি ব্যাকপোর্ট করা ভাল লাগবে। সম্ভব না হলে খারাপ খবর।
পাসক্ল থিভেন্ট

আসলে আমার পরীক্ষাটি আমাকে প্রায় প্রথমবারের জন্য একটি মিথ্যা ইতিবাচক উপহার দিয়েছে (জানতাম আমার অপেক্ষা করা উচিত ছিল!) - এটি এখনও স্থির নয়, বাগটি কেবল ব্লবটাইপডেস্ক্রিপ্টারে চলে গেছে।
জাস্টিন

ধন্যবাদ। @ টাইপ (টাইপ = "org.hibernate.type.BinaryType") আমার জন্য টেবিলের জন্য কাজ করেছে যা পিডিএফ ফাইল সঞ্চয় করে। আমি বুদ্ধিমান রূপান্তরকারী থেকে ওরাকল টু পোস্টগ্র্যাস এসকিউএল ব্যবহার করে ওরাকল থেকে পোস্টগ্র্যাসে একটি ডাটাবেস স্থানান্তরিত করেছি এবং এটি স্বয়ংক্রিয়ভাবে রূপান্তরিত হয়ে বিএলএব থেকে বিওয়টিইএতে প্রবেশ করিয়েছে তবে ব্লবটাইপ আমার পক্ষে কাজ করে নি।
jmoran

উত্তর:


68

বাইট [] সম্পত্তি বর্ণনা করার পোর্টেবল উপায় কী?

এটি নির্ভর করে তুমি কি চাও। জেপিএ কোনও টিকাবিহীন স্থির রাখতে পারে byte[]। জেপিএ ২.০ স্পেস থেকে:

11.1.6 বেসিক টিকা

Basicটীকা একটি ডাটাবেস কলাম ম্যাপিং সহজ প্রকার। Basicটীকা নিম্নলিখিত প্রকারের কোন ক্রমাগত সম্পত্তি বা দৃষ্টান্ত পরিবর্তনশীল প্রয়োগ করা যেতে পারে: জাভা আদিম, ধরনের, আদিম ধরনের চাদরে, java.lang.String, java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar, java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[],Byte[] , char[], Character[], enums এবং অন্য কোন প্রকার কার্যকরী Serializable। বিভাগ ২.৮-এ বর্ণিত হিসাবে, Basicটেকসই ক্ষেত্র এবং এই ধরণের বৈশিষ্ট্যগুলির জন্য টীকাটির ব্যবহার optionচ্ছিক। বেসিক টীকাটি যদি এই জাতীয় ক্ষেত্র বা সম্পত্তির জন্য নির্দিষ্ট না করা হয় তবে বেসিক টীকাগুলির ডিফল্ট মানগুলি প্রযোজ্য হবে।

এবং হাইবারনেট এটিকে "ডিফল্টরূপে" কোনও এসকিউএল VARBINARY(অথবা আকারের LONGVARBINARYউপর নির্ভর করে একটি এসকিউএল Column?) এ মানচিত্র তৈরি করবে যা পোস্টগ্র্রেএসকিউএল একটি দিয়ে পরিচালনা করে bytea

তবে আপনি byte[]যদি একটি বড় অবজেক্টে সঞ্চয় করতে চান তবে আপনার একটি ব্যবহার করা উচিত @Lob। অনুমান থেকে:

11.1.24 লব টিকা

একটি Lobটীকা নির্দিষ্ট করে যে একটি অবিচ্ছিন্ন সম্পত্তি বা ক্ষেত্রটি একটি বৃহত অবজেক্ট হিসাবে একটি ডাটাবেস-সমর্থিত বৃহত অবজেক্ট ধরণের হিসাবে স্থির রাখতে হবে। পোর্টেবল অ্যাপ্লিকেশনগুলির Lobডাটাবেসের ধরণে ম্যাপিং করার সময় টীকাটি ব্যবহার করা উচিত LobLobটীকা বেসিক টীকা সহ বা সাথে ব্যবহার করা যেতে পারে ElementCollectionটীকা যখন উপাদান সংগ্রহ মূল্য মৌলিক ধরনের হয়। এ Lobহয় বাইনারি বা চরিত্রের ধরণের হতে পারে। Lobটাইপ ক্রমাগত ক্ষেত্র বা সম্পত্তি ধরণ থেকে অনুমিত ও সুতো এবং চরিত্র ধরনের, ব্লব ডিফল্ট ছাড়া, করা হয়।

এবং হাইবারনেট এটিকে একটি এসকিউএল এ ম্যাপ করবে BLOBযা পোস্টগ্র্রেএসকিউএল একটি দ্বারা পরিচালনা করে oid

হাইবারনেটের সাম্প্রতিক সংস্করণে এটি কি ঠিক করা হয়েছে?

ঠিক আছে, সমস্যাটি হ'ল সমস্যাটি ঠিক কী তা আমি জানি না। তবে আমি কমপক্ষে বলতে পারি যে 3.5.x শাখায় 3.5.0-বিটা -2 (যা সেখানে একটি পরিবর্তন চালু করা হয়েছে) থেকে কিছুই পরিবর্তিত হয়নি।

কিন্তু মত বিষয় আমার বোঝার HHH-4876 , HHH-4617 এবং পোস্টগ্রি এবং ব্লব (এর javadoc উল্লেখ PostgreSQLDialect) যে আপনি নিম্নলিখিত বৈশিষ্ট্য নির্ধারণের অনুমিত হয়

hibernate.jdbc.use_streams_for_binary=false

আপনি ব্যবহার করতে চান oidঅর্থাত byte[]সঙ্গে @Lob(যা আমার বোঝার, যেহেতু VARBINARYনয় আপনি ওরাকল সঙ্গে কি আপনি চান)। আপনি কি এই চেষ্টা করেছেন?

বিকল্প হিসাবে, এইচএইচএইচ -4876PrimitiveByteArrayBlobType পুরানো আচরণ (হায়ারনেট প্রাক প্রাক 3.5) পেতে অবচয় ব্যবহার করার পরামর্শ দেয় ।

তথ্যসূত্র

  • জেপিএ ২.০ স্পেসিফিকেশন
    • বিভাগ 2.8 "সম্পর্কহীন ক্ষেত্র বা বৈশিষ্ট্যের জন্য ম্যাপিং ডিফল্ট"
    • বিভাগ 11.1.6 "বেসিক টিকা"
    • বিভাগ 11.1.24 "লব টিকা"

সম্পদ


ওএমজি, আমি বুঝতে পারি যে আমি উত্তর দেওয়া শুরু করার পরে এই প্রশ্নটি অনেক পরিবর্তন হয়েছে। পরে সমস্ত পরিবর্তনগুলি পড়বেন এবং প্রয়োজনে পরিবর্তনগুলি হজম করার পরে আমার উত্তরগুলি আপডেট করবেন।
পাস্কাল থিভেন্ট

স্পেকটি দেখতে এটি ভাল, তাই হাইবারনেট ম্যাপে (@ লব + বাইট []) সম্পূর্ণরূপে একটি বড় অবজেক্ট সমর্থিত ধরণের কাছে সঠিক। Postgresql এ 2 টি (বাইটিয়া বা ওড) রয়েছে। যাইহোক, ate.৫ মানচিত্র হাইডনেট করার সময় (ডিফল্টরূপে) এটি জেডিবিসি গেটবাইটস () ব্যবহার করে পড়ে যা পিজিএসকিউএল ড্রাইভার ডেটার পরিবর্তে by বাইট ওড দেয়। এও নোট করুন যে ব্লগ লেখক প্রশ্নটি উত্থাপিত হওয়ার পরে (তার ব্লগে) সবচেয়ে সহায়কভাবে প্রতিক্রিয়া জানিয়েছেন।
জাস্টিন

@ জাস্টিন তবে যাইহোক 3.5 ডিগ্রি হাইডনেট করার সময় (ডিফল্টরূপে) এটি জেডিবিসি গেটবাইটস () ব্যবহার করে পড়েন যা কোন পিজিএসকিউএল ড্রাইভার ডেটার পরিবর্তে 6 বাইট ওড দেয় - hibernate.jdbc.use_streams_for_binary=falseখুব বেশি ব্যবহার করার সময় কি এটি ঘটে ? (স্টিভ এখন কী বলেছেন তা যাচাই করতে যাচ্ছেন)।
পাস্কেল থিভেন্ট

আমি এটি প্রোপার্টি ফাইলে উল্লেখ করার চেষ্টা করতে যাচ্ছি, তবে পোস্টগ্রিএসকিউএলডিএলেটের ব্যবহারকারীর ইনপুটস্ট্রিমটোইনসেটব্লোব () মিথ্যা ফিরিয়েছে তাই আমি ধরে নিলাম যে আমি - যেহেতু আমি স্পষ্টভাবে এই সম্পত্তিটি সেট করছি না।
জাস্টিন

এই সম্পত্তিটি সেট করার পরে (সত্য বা মিথ্যা হয়), আমি একটি রানটাইম ব্যতিক্রম পেয়েছি: ERROR: কলাম "স্বাক্ষর" টাইপ বাইটিয়া তবে এক্সপ্রেশনটি টাইপ অয়েডের। "আমার উল্লেখ করা উচিত আমি হাইবারনেট ব্যবহার করছি 3.5.5. ফাইনাল + পিজি 8.2 ড্রাইভার।
জাস্টিন

10

ওরিলিলি এন্টারপ্রাইজ জাভাবিন্স, 3.0 যা বলেছে তা এখানে

এই খুব বড় বস্তুর জন্য জেডিবিসির বিশেষ ধরণের রয়েছে। Java.sql.Blob প্রকারটি বাইনারি ডেটা উপস্থাপন করে এবং java.sql.Clob অক্ষর ডেটা উপস্থাপন করে।

এখানে PostgreSQLDialect উত্স কোড যায়

public PostgreSQLDialect() {
    super();
    ...
    registerColumnType(Types.VARBINARY, "bytea");
    /**
      * Notice it maps java.sql.Types.BLOB as oid
      */
    registerColumnType(Types.BLOB, "oid");
}

সুতরাং আপনি কি করতে পারেন

নিম্নলিখিত হিসাবে পোস্টগ্রাইএসকিউএলডায়াল্ট ওভাররাইড করুন

public class CustomPostgreSQLDialect extends PostgreSQLDialect {

    public CustomPostgreSQLDialect() {
        super();

        registerColumnType(Types.BLOB, "bytea");
    }
}

এখন আপনার কাস্টম উপভাষার সংজ্ঞা দিন

<property name="hibernate.dialect" value="br.com.ar.dialect.CustomPostgreSQLDialect"/>

এবং আপনার পোর্টেবল জেপিএ @ লব টিকা ব্যবহার করুন

@Lob
public byte[] getValueBuffer() {

হালনাগাদ

এখানে বের করা হয়েছে এখানে

হাইবারনেট ৩.৩.২ তে আমার একটি অ্যাপ্লিকেশন চলছে এবং অ্যাপ্লিকেশনগুলি ঠিকঠাকভাবে কাজ করে , সমস্ত ব্লাড ক্ষেত্রের সাথে ওড (জাভাতে বাইট []) ব্যবহার করে

...

স্থানান্তরিত হচ্ছে হাইবারনেট 3.5 তে সমস্ত ব্লব ফিল্ডগুলিতে আর কাজ করে না এবং সার্ভার লগটি দেখায়: ERROR org.hibernate.util.JDBCExceptionReporter - ERROR: কলামটি টাইপ ওয়েডের তবে এক্সপ্রেশনটি টাইপ বাইটিয়া

যা ব্যাখ্যা করা যেতে পারে এখানে

এই জেনারালিটি পিজি জেডিবিসি-তে কোনও বাগ নেই , তবে হাইবারনেটটির ৩.৫ সংস্করণে ডিফল্ট প্রয়োগের পরিবর্তন হয়েছে । আমার পরিস্থিতিতে সংযোগে সামঞ্জস্যপূর্ণ সম্পত্তি সেট করা কোনও সহায়তা করেনি

...

৩.৫ - বিটা ২-এ যা দেখেছি তা আরও অনেক কিছু, এবং আমি জানি না যে এটি ঠিক করা হয়েছিল কিনা হাইবারনেট - @ টাইপ টিকা ছাড়াই - - টাইপ কলামটি স্বয়ংক্রিয়ভাবে তৈরি করবে, তবে এটিকে বাইটিয়া হিসাবে পড়ার চেষ্টা করবে

মজার কারণ হ'ল তিনি যখন টাইপসকে ম্যাপ করেন B

জেডিবিসি ব্যাচ আপডেট কার্যকর করতে পারেনি

সন্নিবেশ বা আপডেট করার সময়


এই সমাধানটি গৌরবময় দেখাচ্ছে, আমি এখন এটি চেষ্টা করছি।
জাস্টিন

এটি সঠিক ডিডিএল উত্পন্ন করে তবে রানটাইম ব্যর্থ হয়: একটি ব্লব সম্পত্তি সহ কোনও বস্তুর চেষ্টা করার সময় আমি java.sql.BatchUpdateException পাই।
জাস্টিন

@ জাস্টিন পোস্টগ্র্রেএসকিউএল এর পরিবর্তে ওরাকল ব্যবহার করে অনুরূপ দৃশ্যের চেষ্টা করুন এবং দেখুন কী পান। ব্যাচআপডেটএক্সসেপশনটির সাথে ব্যাচ আপডেট অপারেশনের সময় ঘটে যাওয়া ত্রুটিগুলি করতে হবে।
আর্থার রোনাল্ড

আসলে আমি যা চাই তা হ'ল BLOB কে "বাইটিয়া" তে মানচিত্র না দিয়ে পরিবর্তে মানচিত্র (বাইট [] + @ লব) টাইপগুলিতে টীকা সংমিশ্রণ করুন! ভারবাইনারি!
জাস্টিন


7

আমি হাইগ্রনেট ৪.২..7. এসপি ১ ব্যবহার করছি পোস্টগ্রিস ৯.৩ সহ এবং আমার জন্য নিম্নলিখিত কাজগুলি:

@Entity
public class ConfigAttribute {
  @Lob
  public byte[] getValueBuffer() {
    return m_valueBuffer;
  }
}

যেহেতু ওরাকল এর এতে কোনও সমস্যা নেই, এবং পোস্টগ্রিসের জন্য আমি কাস্টম উপভাষাটি ব্যবহার করছি:

public class PostgreSQLDialectCustom extends PostgreSQL82Dialect {

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) {
      return BinaryTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
}

এই সমাধানটির সুবিধাগুলি আমি বিবেচনা করি, আমি হাইবারনেট বয়ামগুলি আটকাতে পারি।

হাইবারনেটের সাথে আরও পোস্টগ্রিস / ওরাকল সামঞ্জস্যতার সমস্যাগুলির জন্য, আমার ব্লগ পোস্টটি দেখুন


2
হাইবারনেট ৪.৩..6 এবং পোস্টগ্র্যাসকিএল ৯ ডায়ালেক্ট বাড়ানোর সাথে আমার জন্য কাজ করেছেন। ধন্যবাদ!
অ্যান্ড্রেস ওভিডো

হাইবারনেট 5.3.7. ফাইনাল এবং পোস্টগ্রিস 95 ডায়ালেক্টের সাথে কাজ করে। থেক্স
বার্নহার্ড কর্ন

6

অবশেষে আমি এই কাজ পেয়েছি। এটি এ। গার্সিয়া থেকে সমাধানটি প্রসারিত হয়েছে, তবে, যেহেতু সমস্যাটি হাইবারনেট টাইপের ম্যাটেরিয়ালাইজড ব্লব টাইপের মধ্যে কেবল ব্লবকে ম্যাপ করা যায়> বাইটায় যথেষ্ট নয়, আমাদের মেটেরালাইজব্লবটাইপ প্রতিস্থাপনের প্রয়োজন যা হাইবারনেট ভাঙা ব্লব সমর্থন নিয়ে কাজ করে। এই বাস্তবায়নটি কেবল বাইটিয়া নিয়েই কাজ করে তবে জিরার সমস্যা থেকে আসা লোকটি যে ওআইডি চেয়েছিল তারা একটি ওআইডি বাস্তবায়নে ভূমিকা রাখতে পারে।

দুর্ভাগ্যক্রমে রানটাইমের সময় এই ধরণের প্রতিস্থাপন করা ব্যথা, যেহেতু এগুলি ডায়ালেক্টের অংশ হওয়া উচিত। যদি কেবল এই JIRA বর্ধন 3.6 এ যায় তবে এটি সম্ভব হবে।

public class PostgresqlMateralizedBlobType extends AbstractSingleColumnStandardBasicType<byte[]> {
 public static final PostgresqlMateralizedBlobType INSTANCE = new PostgresqlMateralizedBlobType();

 public PostgresqlMateralizedBlobType() {
  super( PostgresqlBlobTypeDescriptor.INSTANCE, PrimitiveByteArrayTypeDescriptor.INSTANCE );
 }

  public String getName() {
   return "materialized_blob";
  }
}

এর বেশিরভাগটিই সম্ভবত স্থির থাকতে পারে (গেটবাইন্ডার (আসলেই কোনও নতুন উদাহরণের প্রয়োজন আছে?)), তবে আমি হাইবারনেট অভ্যন্তরীণ সত্যই বুঝতে পারি না তাই এটি বেশিরভাগ অনুলিপি + পেস্ট + সংশোধন করে।

public class PostgresqlBlobTypeDescriptor extends BlobTypeDescriptor implements SqlTypeDescriptor {
  public static final BlobTypeDescriptor INSTANCE = new PostgresqlBlobTypeDescriptor();

  public <X> ValueBinder<X> getBinder(final JavaTypeDescriptor<X> javaTypeDescriptor) {
   return new PostgresqlBlobBinder<X>(javaTypeDescriptor, this);
  }
  public <X> ValueExtractor<X> getExtractor(final JavaTypeDescriptor<X> javaTypeDescriptor) {
   return new BasicExtractor<X>( javaTypeDescriptor, this ) {
    protected X doExtract(ResultSet rs, String name, WrapperOptions options) throws SQLException { 
      return (X)rs.getBytes(name);
    }
   };
  }
}

public class PostgresqlBlobBinder<J> implements ValueBinder<J> {
 private final JavaTypeDescriptor<J> javaDescriptor;
 private final SqlTypeDescriptor sqlDescriptor;

 public PostgresqlBlobBinder(JavaTypeDescriptor<J> javaDescriptor, SqlTypeDescriptor sqlDescriptor) { 
  this.javaDescriptor = javaDescriptor; this.sqlDescriptor = sqlDescriptor;
 }  
 ...
 public final void bind(PreparedStatement st, J value, int index, WrapperOptions options) 
 throws SQLException {
  st.setBytes(index, (byte[])value);
 }
}

আপনার গবেষণার জন্য +1। অভিনন্দন। কেবলমাত্র একটি পরামর্শ: 8 বার পর্যন্ত নিজের প্রশ্ন / উত্তর সম্পাদনা করতে পছন্দ করুন। অন্যথায়, আপনার প্রশ্ন / উত্তরটি সম্প্রদায় উইকিতে পরিণত হবে এবং আপনি খ্যাতি অর্জন করতে পারবেন না এবং ইউপি ভোটের আর গণনা করা হবে না
আর্থার রোনাল্ড

লাইভ এবং শিখুন আমার ধারণা, আমার অনেকগুলি সম্পাদনা ছিল, কারণ আমি আমার পরীক্ষার পরিবেশের সাথে একটি জিনিস বা অন্য কিছু করতে ভুলে যেতে থাকি।
জাস্টিন

এখানে একই, গবেষণা এবং জন্য +1 একটি আপনার পরিস্থিতির জন্য সমাধান।
পাসক্ল থিভেন্ট

4.2.x হাইবারনেট সংস্করণ সহ সমাধানের জন্য কোনও সুযোগ? হাইবারনেট ইন্টার্নালগুলি কিছুটা পরিবর্তিত হয়েছে (আমি ইস্যুটি প্রকাশিত মন্তব্য করেছি: হাইবারনেট.এটিলেসিয়ান.নেট / ব্রাউজ / এইচএইচএইচ-5584 )।
পিটার বাটকোভিচ

2

আমি @ লবটির টীকাগুলি যোগ করে আমার সমস্যাটি সমাধান করেছি যা ওরাকলে বাইট [] ব্লব হিসাবে তৈরি করবে, তবে এই টীকাগুলিটি ওয়েড হিসাবে ক্ষেত্রটি তৈরি করবে যা সঠিকভাবে কাজ করে না, বাইটায় তৈরি করতে] আমি গ্রাহককে ডায়ালেক্ট বানিয়েছি নিচের মত পোস্টগ্রিস

Public class PostgreSQLDialectCustom extends PostgreSQL82Dialect {
    public PostgreSQLDialectCustom() {
        System.out.println("Init PostgreSQLDialectCustom");
        registerColumnType( Types.BLOB, "bytea" );

      }

    @Override
    public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (sqlTypeDescriptor.getSqlType() == java.sql.Types.BLOB) {
      return BinaryTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
 }

ডায়ালেক্টের জন্য পরামিতিগুলি ওভাররাইড করা দরকার

spring.jpa.properties.hibernate.dialect = com.ntg.common.DBCompatibilityHelper.PostgreSQLDialectCustom

আরও ইঙ্গিতটি তার সন্ধান করতে পারে: https://dzone.com/articles/postgres-and-oracle


0

পোস্টগ্রিসের জন্য এক্সএমএল ফাইলের সাথে টীকাগুলি ওভাররাইড করে আমি এটির কাজ পেয়েছি। টীকাগুলি ওরাকল জন্য রাখা হয়। আমার মতে, এই ক্ষেত্রে এটি সর্বোত্তম হবে যে আমরা এই সমস্যাটির ম্যাপিংটিকে ওভাররাইড করব - এক্সএমএল ম্যাপিংয়ের সাথে কিছু শত্রুতা। আমরা এক্সএমএল ম্যাপিংয়ের মাধ্যমে একক / একাধিক সত্ত্বাকে ওভাররাইড করতে পারি। সুতরাং আমরা আমাদের প্রধানত-সমর্থিত ডাটাবেসের জন্য টীকা এবং একে অপরের ডাটাবেসের জন্য একটি এক্সএমএল ফাইল ব্যবহার করব।

দ্রষ্টব্য: আমাদের কেবল একটি একক শ্রেণিকে ওভাররাইড করা দরকার, তাই এটি কোনও বড় বিষয় নয়। আমার উদাহরণ থেকে আরও পড়ুন এক্সএমএল সহ টীকাটি ওভাররাইড করার উদাহরণ


0

পোস্টগ্র্রেসে লব বাইট ভাঙছে [] এটি ওয়েড হিসাবে সংরক্ষণ করার চেষ্টা করে এবং স্ট্রিংয়ের ক্ষেত্রেও একই সমস্যা দেখা দেয়। নীচের কোডটি পোস্টগ্র্রেসে ভাঙ্গছে যা ওরাকলটিতে সূক্ষ্মভাবে কাজ করছে।

@Lob
private String stringField;

এবং

@Lob
private byte[]   someByteStream;

পোস্টগ্রাগে উপরের ঠিক করার জন্য কাস্টম হাইবারনেট.ডায়ালেক্টের নীচে লিখেছেন

public class PostgreSQLDialectCustom extends PostgreSQL82Dialect{

public PostgreSQLDialectCustom()
{
    super();
    registerColumnType(Types.BLOB, "bytea");
}

 @Override
 public SqlTypeDescriptor remapSqlTypeDescriptor(SqlTypeDescriptor sqlTypeDescriptor) {
    if (Types.CLOB == sqlTypeDescriptor.getSqlType()) {
      return LongVarcharTypeDescriptor.INSTANCE;
    }
    return super.remapSqlTypeDescriptor(sqlTypeDescriptor);
  }
}

হাইবারনেটে কাস্টম ডায়ালেক্ট কনফিগার করুন

hibernate.dialect=X.Y.Z.PostgreSQLDialectCustom   

এক্সওয়াইজেড হ'ল প্যাকেজের নাম।

এখন এটা ঠিক আছে। দ্রষ্টব্য- আমার হাইবারনেট সংস্করণ - 5.2.8. ফাইনাল পোস্টগ্র্যাস সংস্করণ- 9.6.3


0

জাস্টিনকে ধন্যবাদ, আমাকে সঠিক দিকে পরিচালিত করার জন্য পাস্কাল। হাইবারনেট ৩.৩.৩ নিয়েও আমি একই সমস্যার মুখোমুখি ছিলাম। আপনার গবেষণা এবং সঠিক ক্লাসের দিকে নির্দেশকরা আমাকে সমস্যাটি সনাক্ত করতে এবং সমাধান করতে সহায়তা করেছিল।

যারা এখনও হাইবারনেট ৩.৩ এর সাথে আটকে আছেন এবং ওড + বাইট [] + @ লব সংমিশ্রণটি ব্যবহার করছেন তাদের সুবিধার জন্য, সমস্যাটি সমাধান করার জন্য আমি যা করেছি তা নীচে দেওয়া হল।

  1. আমি একটি কাস্টম ব্লবটাইপ তৈরি করেছি যা মেটেরালাইজড ব্লবটাইপ প্রসারিত করে এবং ওড শৈলীর অ্যাক্সেসের সাহায্যে সেট ও ওভাররাইডিং সেটটিকে ওভাররাইড করে।

    public class CustomBlobType extends MaterializedBlobType {
    
    private static final String POSTGRESQL_DIALECT = PostgreSQLDialect.class.getName();
    
    /**
     * Currently set dialect.
     */
    private String dialect = hibernateConfiguration.getProperty(Environment.DIALECT);
    
    /*
     * (non-Javadoc)
     * @see org.hibernate.type.AbstractBynaryType#set(java.sql.PreparedStatement, java.lang.Object, int)
     */
    @Override
    public void set(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
        byte[] internalValue = toInternalFormat(value);
    
        if (POSTGRESQL_DIALECT.equals(dialect)) {
            try {
    
    //I had access to sessionFactory through a custom sessionFactory wrapper.
    st.setBlob(index, Hibernate.createBlob(internalValue, sessionFactory.getCurrentSession()));
                } catch (SystemException e) {
                    throw new HibernateException(e);
                }
            } else {
                st.setBytes(index, internalValue);
            }
        }
    
    /*
     * (non-Javadoc)
     * @see org.hibernate.type.AbstractBynaryType#get(java.sql.ResultSet, java.lang.String)
     */
    @Override
    public Object get(ResultSet rs, String name) throws HibernateException, SQLException {
        Blob blob = rs.getBlob(name);
        if (rs.wasNull()) {
            return null;
        }
        int length = (int) blob.length();
        return toExternalFormat(blob.getBytes(1, length));
      }
    }
    1. হাইবারনেটের সাথে কাস্টমব্লবটাইপ নিবন্ধন করুন। নিম্নলিখিতটি আমি অর্জন করতে পেরেছি।

      hibernateConfiguration= new AnnotationConfiguration();
      Mappings mappings = hibernateConfiguration.createMappings();
      mappings.addTypeDef("materialized_blob", "x.y.z.BlobType", null);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.