مقدمة: لماذا hbm2ddl.auto هو سلاح ذو حدين
\n\nكل من قام بإعداد Hibernate (أو Spring Boot مع JPA) واجه هذا السطر الغامض في ملف application.properties أو hibernate.cfg.xml:
spring.jpa.hibernate.ddl-auto=update\n# أو\nhibernate.hbm2ddl.auto=create\n\n\nفي Stack Overflow، حصد هذا السؤال مئات الآلاف من المشاهدات. وهذا ليس بدون سبب: القيمة الخاطئة قد تدمر بياناتك، بينما القيمة الصحيحة قد توفر لك ساعات من العمل. في هذا المقال، سنشرح جميع القيم الممكنة لـ hibernate.hbm2ddl.auto، ونقدم أمثلة عملية بلغة Java، ونلقي نظرة تحت الغطاء لنفهم كيف يدير Hibernate بنية قاعدة البيانات فعلياً.
ما هو hbm2ddl.auto ولماذا نحتاجه؟
\n\nHibernate hbm2ddl.auto هو معامل إعداد يتحكم في الإنشاء التلقائي أو التحديث أو التحقق من بنية قاعدة البيانات بناءً على الكيانات (Entity) الخاصة بك. بمعنى آخر، ينظر Hibernate إلى الفئات التي تحمل التعليقات التوضيحية @Entity و @Table و @Column ويقوم بإنشاء استعلامات SQL مثل CREATE TABLE و ALTER TABLE بشكل فوري.
هذا مفيد جداً في مرحلة التطوير، لكنه قد يسبب كارثة في بيئة الإنتاج إذا لم تفهم كيفية عمل كل قيمة من الداخل.
\n\nالقائمة الكاملة للقيم الممكنة لـ hibernate.hbm2ddl.auto
\n\nيدعم Hibernate خمس قيم (بالإضافة إلى none التي تعني عدم القيام بأي إجراء):
- \n
validate— التحقق فقط من البنية \n update— التحديث التلقائي \n create— الإنشاء من جديد عند بدء التشغيل \n create-drop— الإنشاء عند بدء التشغيل والحذف عند الإيقاف \n none— عدم القيام بأي شيء (القيمة الافتراضية) \n
دعنا نشرح كل قيمة بالتفصيل، مع أمثلة وشرح لما يحدث "تحت الغطاء".
\n\n1. validate — التحقق فقط، بدون تعديل
\n\nكيف يعمل: عند بدء تشغيل التطبيق، يقارن Hibernate كيانات Java الخاصة بك مع البنية الفعلية للجداول في قاعدة البيانات. إذا كان كل شيء متطابقاً، يبدأ التطبيق. إذا لم يكن كذلك، يرمي Hibernate استثناء SchemaValidationException.
مثال على الإعداد:
\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)، فسيحدث خطأ.
متى تستخدمه: مثالي لـ بيئة الإنتاج للتأكد من أن الترحيلات (Liquibase/Flyway) لم تخالف التوافق مع الكود.
\n\n2. update — التحديث التلقائي (بحذر!)
\n\nكيف يعمل: يضيف Hibernate تلقائياً الجداول والأعمدة والقيود الجديدة إذا لم تكن موجودة في قاعدة البيانات. لكنه لا يقوم أبداً بحذف الأعمدة أو الجداول، حتى لو قمت بإزالتها من كود Java.
\n\nمثال على الإعداد:
\n\n// application.properties\nspring.jpa.hibernate.ddl-auto=update\n\n\nمثال على التعديل: