كيفية حجز مجموعة من المعرفات الرئيسية الأساسية لإجراء عمليات التحميل المسبق
سؤال
نود حجز مجموعة من معرفات المفاتيح الأساسية لجميع الجداول (على سبيل المثال 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 لكل إدراج جدول جديد).
هذا ما نستخدمه دون الكثير من المشاكل.