سؤال

أقوم بتطوير تطبيق باستخدام Oracle 11G، Java (Struts2) والإسبات.

لدي جدول يدعى MyTemp مع العمود MyTEMP_ID وهو رقم النوع (22،0).

في معرف ملف mytemp.hbm.xml هو كما هو موضح أدناه

<id name="mytempId" type="big_decimal">
        <column name="MYTEMP_ID" precision="22" scale="0" />
        <generator class="sequence">
            <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
        </generator>
    </id>

في متسلسل قاعدة بيانات Oracle المسمى "mytemp_temp_id_seq" يتم إنشاؤه ويعمل بشكل جيد في Oracle.

الآن عندما أحاول إدراج سجل باستخدام السبات، فإنه يعطيني الخطأ

org.hibernate.id.identiergenerationException: يولد مولد الهوية هذا طويلا، عدد صحيح، قصير أو سلسلة

يبدو أنه كما ترجع التسلسل برقم، هيبيني بالنظر إلى أنه كبير التصميم، في حين أن فئة مولد Sequece في السبات النظر في القيم الطويلة، عدد صحيح، قصيرة وسلسلة فقط.

يجب ألا يكون السبات مشكلة كبيرة. لكنني أعتقد أنهم لم ينفذوا BigDeMal

هل يمكن لأي شخص مساعدتي في حل المشكلة؟

شكرًا.

هل كانت مفيدة؟

المحلول

أن نكون صادقين معك، لا أستطيع أن أتخيل لماذا تصرح على وجود هويتك ككبرا كبيرا بدلا من فترة طويلة. القيمة القصوى القصيرة هي 9,223,372,036,854,775,807 والتي، على الرغم من أنه من المسلم به حوالي الألف من القيمة القصوى (22)، يجب أن يكون حقا هادئ بشكل كافي. وبعد إذا كنت لتوليد واحد مليون معرفات كل ثانية, ، عليك أن تفعل ذلك من أجل 300000 سنة من أجل استنفاد التسلسل الخاص بك.

ومع ذلك، من أجل الحصول على معرفك الذي تم إنشاؤه على أنه bigdevaly ستحتاج إلى كتابة مولد خاص بك. يمكنك القيام بذلك عن طريق توسيع نطاق السجلات المدمجة في السبات وتجاوز generate() طريقة. بدلا من الاتصال إلى IdentifierGeneratorFactory.get() الذي يدعم فقط الطويل / الدولي / قصير / سلسلة ستحصل على قيمة التسلسل الخاصة بك من النتيجة تعيين كبثرة.

سوف تحتاج بعد ذلك أعلن مولدك عن طريق تحديد اسم فئة كاملة:

<generator class="com.mypackage.BigDecimalGenerator">
  <param name="sequence">MYTEMP_TEMP_ID_SEQ</param>
</generator>

نصائح أخرى

هل قمت بتعيين اللهجة الصحيحة؟ يجب أن يكون ذلك كافيا لجعل السبات فهم نتيجة التسلسل.

تحرير] المشكلة هي أن نوع التسلسل الخاص بك لا يتطابق مع نوع العمود الخاص بك. يمكن أن يلقي التسلسل (حسب رسالة الخطأ في السبات) إلى فترة طويلة أو عدد صحيح أو قصير أو سلسلة أثناء إرجاع تسلسلك كبيرا.

أقترح تحديد نوع عمود المعرف بأنه "طويل" على الرغم من أن أوراكل لا يعرف هذا النوع. داخليا، يجب أن تكون السبات قادرا على إلقاء كل شيء من أجل الجميع بشكل صحيح.

بالتااكيد. يجب أن يكون معرف طويل يكفي دائما النظر في عدد السجلات الفريدة التي يمكن أن تولدها. مولد معين مجرد قيم خاصة قد تكون غير عدد صحيح اكتب أو للتحكم في عدد صحيح نوع القيم لسبب ما (قد تكون محددة المشروع).

أيضا، المولد هو قاعدة البيانات الخاصة مثل تسلسل أوراكل، لذلك التعريف الدوامة يهم أيضا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top