سؤال

تحتوي جداول postgresql الخاصة بي على معرف من النوع bigserial, ، بمعنى أنه يتم توليدها في صفوف الوقت يتم إدخالها (وبالتالي ، لا يتم توفير قيمة عمود المعرف في INSERT بيان). أواجه صعوبة في العثور على القيمة المناسبة ل <generator class="..."> سمة في ملف تعيين XML الخاص بي.

الرمز أدناه هو الأقرب الذي وجدته يبدو أنه الأقرب إلى Postgres ، لكنه لا يزال يؤدي SELECT nextval(...) على التسلسل قبل الإدراج (وإدراج قيمة حقل المعرف بشكل صريح على الإدراج). أريد فقط أن لا تتضمن Hibernate قيمة حقل المعرف على الإطلاق ، مما يسمح لـ Postgres بالقيام بعملها في توليد القيمة نفسها.

    <id name="id" column="id" type="java.lang.Long">
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
    </id>
هل كانت مفيدة؟

المحلول

هذا غير موثق ولكن يمكنك بالفعل استخدام identity مولد مع postgreSQL عندما يكون PK من النوع SERIAL أو BIGSERIAL:

<id name="id" column="user_id" type="java.lang.Long">
     <generator class="identity"/>
</id>

نرى HB-875 و HHH-1675 لخلفية على هذا.

نصائح أخرى

من ما قرأته:

<id name="id" column="id" type="java.lang.Long">
    <generator class="sequence">
        <param name="sequence">my_sequence_name</param>
    </generator>
</id>

يجب أن تعمل أسرع من:

<id name="id" column="id" type="java.lang.Long">
    <generator class="identity" />
</id>

يندرج مولد التسلسل في المولدات poid غير الإضافية موصوف مثل هذا:

المولدات poid غير الإضافية هي الخيار الأفضل للتطبيقات الجديدة. تسمح هذه المولدات Nhibernate بتعيين هوية لكائن ثابت دون كتابة بيانات الكائن إلى thedatabase ، مما يسمح لـ Nhibernate بتأخير الكتابة حتى تكتمل المعاملة التجارية ، مما يقلل من رحلات مستديرة إلى قاعدة البيانات.

في حين أن مولد الهوية المولدات poid بعد الإدخال مجموعة:

تتطلب المولدات PoID بعد الإدخال أن تستمر البيانات في قاعدة البيانات لإنشاء معرف. هذا يغير سلوك nhibernate بطرق خفية للغاية ويؤدي إلى تعطيل بعض ميزات الأداء. على هذا النحو ، فإن استخدام هذه المولدات poid محبط بشدة! يجب استخدامها فقط مع قواعد البيانات الحالية حيث تعتمد تطبيقات أخرى على هذا السلوك.

تم أخذ اقتباسات من كتاب طبخ Nhibernate 3.0.

حاول المتابعة وعملت:

<id name="id" column="id" type="long" unsaved-value="null" >
        <generator class="sequence">
            <param name="sequence">my_sequence_name</param>
        </generator>
</id>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top