Hibernate hbm2ddl.auto: القيم، الأمثلة، وآلية العمل الداخلية

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا hbm2ddl.auto هو سلاح ذو حدين

\n\n

كل من قام بإعداد Hibernate (أو Spring Boot مع JPA) واجه هذا السطر الغامض في ملف application.properties أو hibernate.cfg.xml:

\n\n
spring.jpa.hibernate.ddl-auto=update\n# أو\nhibernate.hbm2ddl.auto=create\n
\n\n

في Stack Overflow، حصد هذا السؤال مئات الآلاف من المشاهدات. وهذا ليس بدون سبب: القيمة الخاطئة قد تدمر بياناتك، بينما القيمة الصحيحة قد توفر لك ساعات من العمل. في هذا المقال، سنشرح جميع القيم الممكنة لـ hibernate.hbm2ddl.auto، ونقدم أمثلة عملية بلغة Java، ونلقي نظرة تحت الغطاء لنفهم كيف يدير Hibernate بنية قاعدة البيانات فعلياً.

\n\n

ما هو hbm2ddl.auto ولماذا نحتاجه؟

\n\n

Hibernate hbm2ddl.auto هو معامل إعداد يتحكم في الإنشاء التلقائي أو التحديث أو التحقق من بنية قاعدة البيانات بناءً على الكيانات (Entity) الخاصة بك. بمعنى آخر، ينظر Hibernate إلى الفئات التي تحمل التعليقات التوضيحية @Entity و @Table و @Column ويقوم بإنشاء استعلامات SQL مثل CREATE TABLE و ALTER TABLE بشكل فوري.

\n\n

هذا مفيد جداً في مرحلة التطوير، لكنه قد يسبب كارثة في بيئة الإنتاج إذا لم تفهم كيفية عمل كل قيمة من الداخل.

\n\n

القائمة الكاملة للقيم الممكنة لـ hibernate.hbm2ddl.auto

\n\n

يدعم Hibernate خمس قيم (بالإضافة إلى none التي تعني عدم القيام بأي إجراء):

\n\n
    \n
  • validate — التحقق فقط من البنية
  • \n
  • update — التحديث التلقائي
  • \n
  • create — الإنشاء من جديد عند بدء التشغيل
  • \n
  • create-drop — الإنشاء عند بدء التشغيل والحذف عند الإيقاف
  • \n
  • none — عدم القيام بأي شيء (القيمة الافتراضية)
  • \n
\n\n

دعنا نشرح كل قيمة بالتفصيل، مع أمثلة وشرح لما يحدث "تحت الغطاء".

\n\n

1. validate — التحقق فقط، بدون تعديل

\n\n

كيف يعمل: عند بدء تشغيل التطبيق، يقارن Hibernate كيانات Java الخاصة بك مع البنية الفعلية للجداول في قاعدة البيانات. إذا كان كل شيء متطابقاً، يبدأ التطبيق. إذا لم يكن كذلك، يرمي Hibernate استثناء SchemaValidationException.

\n\n

مثال على الإعداد:

\n\n
// application.properties\nspring.jpa.hibernate.ddl-auto=validate\n
\n\n

مثال على كيان:

\n\n
@Entity\n@Table(name = "users")\npublic class User {\n    @Id\n    @GeneratedValue(strategy = GenerationType.IDENTITY)\n    private Long id;\n    \n    @Column(name = "email", nullable = false, length = 255)\n    private String email;\n    \n    @Column(name = "age")\n    private Integer age;\n}\n
\n\n

ما يحدث تحت الغطاء: يقرأ Hibernate بيانات الكيان، ويشكل تمثيلاً داخلياً لجدول users بالأعمدة id و email (NOT NULL، طول 255) و age. ثم ينفذ استعلام SQL إلى information_schema (أو ما يعادله في قاعدة بياناتك) ويقارن الأنواع، وقابلية القيم الفارغة، والأطوال. إذا كان العمود email في قاعدة البيانات من نوع VARCHAR(100)، فسيحدث خطأ.

\n\n

متى تستخدمه: مثالي لـ بيئة الإنتاج للتأكد من أن الترحيلات (Liquibase/Flyway) لم تخالف التوافق مع الكود.

\n\n

2. update — التحديث التلقائي (بحذر!)

\n\n

كيف يعمل: يضيف Hibernate تلقائياً الجداول والأعمدة والقيود الجديدة إذا لم تكن موجودة في قاعدة البيانات. لكنه لا يقوم أبداً بحذف الأعمدة أو الجداول، حتى لو قمت بإزالتها من كود Java.

\n\n

مثال على الإعداد:

\n\n
// application.properties\nspring.jpa.hibernate.ddl-auto=update\n
\n\n

مثال على التعديل:

المدونات

توصيات الكتب