لا يؤثر استخدام السبات لتسلسل postgresql
-
28-09-2019 - |
سؤال
لقد قمت بتكوين 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".
- GenerType.Auto -> تعامل باسم GenerType.sequence
- GenerType.sequence -> خرائط إلى org.hibernate.id.enhanced.SearenCESTYLEGENERATOR التي تمت مناقشتها في المدونة
- 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 والعثور على الجداول أو الأعمدة أو الأسماء المتسلسلة.