كيفية حجز مجموعة من المعرفات الرئيسية الأساسية لإجراء عمليات التحميل المسبق

StackOverflow https://stackoverflow.com/questions/2606182

سؤال

نود حجز مجموعة من معرفات المفاتيح الأساسية لجميع الجداول (على سبيل المثال 1-1000) حتى نتمكن من الحصول على النظام مع بيانات النظام المحملة مسبقًا.

جميع فئات كيان JPA لدينا لديها التعريف التالي للمفتاح الأساسي.

@Id
@GeneratedValue(strategy = IDENTITY)
@Column(name = "id", unique = true, nullable = false, insertable = false, updatable = false)
private Integer id;

هل هناك طريقة لإخبار قاعدة البيانات بأن الزيادات يجب أن تبدأ في الحدوث من 1000 (أي بيانات خاصة بالعميل ستبدأ من 1000 فصاعدًا). نحن ندعم (h2, mysql, postgres) في بيئتنا وأفضل حلًا يمكن قيادته عبر JPA وأدوات DDL الهندسية العكسية من السبات.

اسمحوا لي أن أعرف إذا كان هذا هو النهج الصحيح

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

المحلول

يمكنك تجربة TABLE الاستراتيجية بدلا من IDENTITY. من كتاب السبات:

يشبه إلى حد كبير السبات hilo إستراتيجية، TABLEيعتمد على جدول قاعدة البيانات الذي يحتفظ بآخر مفتاح أساسي إنشاء عدد صحيح تم إنشاؤه ، ويتم تعيين كل مولد إلى صف واحد في هذا الجدول. يحتوي كل صف على عمودين: pkColumnNameو valueColumnName. ال pkColumnValue يعين كل صف إلى مولد معين ، ويحمل عمود القيمة آخر مفتاح أساسي تم استرداده. يخصص مزود الثبات allocationSize الأعداد الصحيحة في كل منعطف.

هنا مثال مع المزيد من التفسير. وأكثر تعقيدًا مثال على تعيين القيمة الأولية.

يمكنك أيضًا محاولة استخدام مولد تسلسل مخصص ، محدد في الخاص بك orm.xml, ، مثله:

<sequence-generator name="mySequenceGenerator"
  sequence-name="MY_SEQUENCE"
  initial-value="123"
  allocation-size="20"/>

هذا يعلن أن تسلسل قاعدة البيانات اسمه MY_SEQUENCE مع القيمة الأولية 123 يمكن استخدامها كمصدر لتوليد معرفات قاعدة البيانات ، وأن محرك الثبات يجب أن يحصل على 20 قيمًا في كل مرة يحتاج فيها إلى معرفات. (لاحظ ، رغم ذلك ، أن التعليقات التوضيحية ، في وقت كتابة هذا التقرير ، تتجاهل initialValue إعداد.)

لتطبيق مولد المعرف هذا لكيان معين ، استخدم اسمه:

@Entity
class name MyEntity {
  @Id @GeneratedValue(generator = "mySequenceGenerator")
  String id;
}

نصائح أخرى

إذا فشل كل شيء آخر ، فيمكنك دائمًا كتابة مولد ID المخصص الخاص بك واستخدامه في DAO الخاص بك create(Entity entity) طريقة. يمكن أن يكون جدول تسلسل الهوية مثل

-------------------------------------------------------------
| sequence_name | initial_value | current_value | increment |
-------------------------------------------------------------
|           foo |          1001 |          2000 |       100 |

هذا قد يعني أن معرفات الجدول foo ابدأ في 1001 ويتم زيادة 100 (لذلك لا يتعين عليك الاتصال بـ DB لكل إدراج جدول جديد).

هذا ما نستخدمه دون الكثير من المشاكل.

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