سؤال

لقد قمت بتكوين Hibernate لاستخدام تسلسل postgresql (عبر التعليقات التوضيحية) لإنشاء قيم للمفتاح الأساسي هوية شخصية العمود على النحو التالي:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

ما أراه مع هذا التكوين هو أن السبات يتم تعيينه بالفعل هوية شخصية القيم> 3000 على الاستمرار ، في حين أن الاستعلام على التسلسل المستخدم يوضح ما يلي:

database=# select last_value from entity_id_seq;
last_value 
------------
     69

(صف واحد)

أسئلة:
هل هناك أي خطأ أم لا؟
هل يجب أن تزامن السبات مع جدول التسلسل؟
إذا لم يكن كذلك ، فأين تخزن آخر معرف تم إنشاؤه؟

شكرًا لك.

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

المحلول

كان لي نفس المشكلة. يرتبط باستراتيجيات تخصيص هوية السبات. هل تختار GenerType.quence, ، يستخدم Hibernate استراتيجية Hilo التي تخصص معرفات في كتل 50 بشكل افتراضي. حتى تتمكن من التعيين بشكل صريح تخصيص قيمة مثل هذه:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="entity_id_seq", allocationSize=1)
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="pk_sequence")
@Column(name="id", unique=true, nullable=false)
public int getId() {
    return this.id;
}

رغم ذلك ، سمعت أيضًا آراء أن استخدام استراتيجية Hilo مع تخصيص = 1 ليست ممارسة جيدة. يوصي بعض الناس بالاستخدام GenerType.Auto بدلاً من ذلك عندما يتعين عليك التعامل مع تسلسلات تديرها قاعدة البيانات

تحديث: لقد انتهى بي الأمر مع التخصيص = 1 ، ويبدو أن الأمور تعمل كما أتوقع الآن. طلبي هو أنني لست بحاجة حقًا إلى كتل من المعرفات على أي حال ، لذلك ymmv.

نصائح أخرى

لا تستخدم GenerType.Sefore لتسلسلات postgres!

إنه أمر غير بديهي تمامًا ، لكن الأشخاص السبات يفسدون هذا. أنت يجب استخدام GenerType.Auto أو سبات الإرادة هدم تسلسلاتك إذا كان عليك إعادة تشغيل/إعادة بناء DB الخاص بك. من المهم تقريبًا أن يسمحوا لهذا الرمز بالدخول إلى بناء الإنتاج ، لكن فريق السبات يشتهر بمواقفهم التي ترأسها الثور نحو المواقف التي تبرز بشكل قاطع (تحقق من موقعه على الوصلات اليسرى ، على سبيل المثال).

أولاً ، عليك تحديد إصدار السبات الذي تستخدمه. فيما يتعلق بالإصدارات السفلية ، قدم 3.2 فصاعدًا دعمًا أكثر اتساقًا لمولدات الهوية خاصة فيما يتعلق بالتعليقات المحددة في التعليقات التوضيحية. نرى http://in.relation.to/bloggers/new323hibernateidentifiergenerators لمناقشة.

قدم 3.6 بعد ذلك إعدادًا ('hibernate.id.new_generator_mappings') مما يجعل المولدات التي تمت مناقشتها في تلك المدونة تتم معالجة طريقة jpa-annots. الإعداد خاطئ افتراضيًا لأن السبات يجب أن يحافظ على التوافق مع الإصدارات القديمة. إذا كنت تريد السلوك الجديد (الموصى به تمامًا) ، فما عليك سوى تعيين هذا الإعداد على True.

يعتمد كيفية معالجة GenerationType على الإصدار الذي تستخدمه وما إذا كان لديك "hibernate.id.new_generator_mappings" على TRUE. سأفترض أنك تستخدم 3.6+ (نظرًا لأن أي شيء أكبر سناً هو ، قديم ، قديم) ولديه "hibernate.id.new_generator_mappings".

  1. GenerType.Auto -> تعامل باسم GenerType.sequence
  2. GenerType.sequence -> خرائط إلى org.hibernate.id.enhanced.SearenCESTYLEGENERATOR التي تمت مناقشتها في المدونة
  3. GenerType.table -> خرائط إلى org.hibernate.id.enhanced.tableGenerator Class التي تمت مناقشتها في المدونة

في Postgres سأفعل هذا:

@Id 
@SequenceGenerator(name="pk_sequence",sequenceName="\"entity_id_seq\"")
@GeneratedValue(strategy=GenerationType.SEQUENCE,generator="\"pk_sequence\"")
@Column(name="\"id\"", unique=true)
private int id;

في الغالب مع أسماء كبيرة ، يجب تمرير عروض الأسعار الناجمة عن الأسماء من أجل فهم Postgres والعثور على الجداول أو الأعمدة أو الأسماء المتسلسلة.

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