الجمعة، 11 أكتوبر 2019

ماهي JPA في لغة الجافا

ماهي JPA في لغة الجافا

ماهي JPA في لغة الجافا


ماهي JPA في لغة الجافا


ماهي JPA في لغة الجافا


في الكثير من البرامج نحاول تخزين الإعدادات في ملفات غير ملفات الكود، بحيث لا يؤثر تغير هذه الإعدادات على الكود، ولا يضطرنا تصحيحها إلى اعادة ترجمة (compile) البرنامج، ومن الأمثلة على ذلك معلومات الاتصال بقاعدة البيانات، حيث يعرفها البعض (خصوصا مبرمجي ADO) باسم connection string، فلو قمت بتخزينها في الكود، وتم تغيير المنفذ أو عنوان قاعدة البيانات ستحتاج إلى التغيير داخل كود البرنامج، إن الأفضل بدلا من ذلك تخزين هذه المعلومات في ملف خارجي وقراءأتها منه عند تشغيل البرنامج.

لمحة عن JBA

عندما تسأل عن الملف persistence.xml فأنت حتما تستخدم JBA وأفترض أن لديك فكرة عن ORM الذي يعد JBA أحد أنواعه.
للتذكير، JBA (Java Persistence Api) هو مكتبة من مكتبات جافا، تستخدم لتثبيت (persist) الأغراض في وسيط تخزين دائم مثل قاعدة بيانات، الكلمة persistence تعني الثبات أو الديمومة، إن JBA هو أحد أنواع ORM.
مقالة ويكيبيديا حول JPAhttps://en.wikipedia.org/wiki/Java_Persistence_API
ORM (Object-Relational Mapping) هو طريقة لمقابة الأغراض في البرنامج الغرضي التوجه مع العلاقات والبيانات الموجودة في قاعدة بيانات، أي عبارة عن طريقة لتصميم البرنامج بحيث يكون لدينا نظام لتحويل أنواع البيانات (الأغراض) إلى أنواع بيانات أخرى تكون متوافقة مع قاعدة البيانات.
مقالة ويكيبيديا عن الموضوع https://en.wikipedia.org/wiki/Object-relational_mapping
بأبسط شكل، سيكون لديك صنف (Class) مقابل لكل جدول في قاعدة البيانات، يسمى هذا الصنف بـEntity، والأغراض من هذا الصنف تقابل أسطر الجدول، الاتصال إلى قاعدة البيانات وتنفيذ الاستعلامات سيتم من خلال مجموعة من الأصناف (Classes) المقدمة في JBA، وأهمها EntityManager الذي سيقوم بإدارة الأغراض التي تمثل أسطر الجداول، وقراأتها من قاعدة البيانات وتخزينها فيها.

الملف persistence.xml

هو عبارة عن ملف له صيغة محددة تماما، يتم التصريح فيه عن Persistence Units والتي سأسميها وحدات التثبيت، حيث أن وحدة التثبيت هي مجموعة من الأصناف التي تمثل جداول مترابطة في قاعدة البيانات (مثلا وحدة تثبيت لتمثيل جداول hr) في قاعدة بيانات صغيرة سنستخدم وحدة تثبيت واحدة لتمثيل كل الجداول معا.
لنأخذ كمثال الملف التالي

  
    org.eclipse.persistence.jpa.PersistenceProvider
    me.bttb.first.javafx.db.oracle.hr.entities.Countries
    me.bttb.first.javafx.db.oracle.hr.entities.Jobs
    me.bttb.first.javafx.db.oracle.hr.entities.Regions
    me.bttb.first.javafx.db.oracle.hr.entities.Departments
    me.bttb.first.javafx.db.oracle.hr.entities.JobHistory
    me.bttb.first.javafx.db.oracle.hr.entities.Locations
    me.bttb.first.javafx.db.oracle.hr.entities.Employee
    
      
      
      
      
    
  
إذا لاحظت هرمية ملف xml السابق ستجد أن العقدة الأولى تعرف وحدة تثبيت اسمها hrPU وبعدها يذكر الاسم الكامل للصنف الذي يقدم خدمات JBA provider (حيث يوجد أكثر من مكتبة لدعم JBA) وبعدها تذكر الأصناف التي تكون وحدة التثبيت حيث يكون كل واحد من هذه الأصناف المذكورة في عقد class هي Entity، ثم تذكر الخواص في عقد من نوع property، والتي تحدد كيف سيتم الاتصال بقاعدة البيانات، ومالذي سيقوم به JPA provider عند التعامل معها، مثلا أول خاصية لها الإسم javax.persistence.jdbc.url وقيمتها هي عنوان الاتصال إلى قاعدة البيانات، وكما تعلم، تأسيس الاتصال يحتاج دوما إلى url, username, password and Driver حيث الـDriver هو الصنف الذي يسمح بالإتصال الفعلي بقاعدة البيانات (راجع الاتصال من خلال JDBC حيث أن JBA مبنية فوق JDBC وتستخدمه في الاتصال).

كيف أقوم بكتابة وتعديل الملف persistence.xml

إن التعامل وبنية الملف persistence.xml معرفة في JBA Standard والذي تجد النسخة النهائة منه في الموقع https://jcp.org/aboutJava/communityprocess/final/jsr338/index.html
بالتأكيد ليس من السهل قرأة معيار ضخم كهذا، ولكن يمكن ابقاؤه كمرجع، عمليا، تستطيع الاستفادة من بيئات البرمجة مثل Eclipse أو NetBeans لتوليد وإدارة الملف persistence.xml، المعلومات المقدمة من خلال المثال كافية للحصول على وحدة تثبيت تعمل بشكل صحيح.
ماذا لوأردت تعريف أكثر من وحدة تثبيت؟ لا مشكلة!! ضعها في نفس الملف بعد نهاية وحدة التثبيت الأولى.
أين أخزن الملف persistence.xml في برنامجي؟ داخل الحزمة META-INF.
كيف أستفيد من الملف persistence.xml؟
كما قلت الملف يعرف وحدات التثبيت، أنت لا تستخدم الملف بشكل مباشر، بل تستخدم وحدة التثبيت للحصول على EntityManager (طبعا إذا لم تكن تستخدم حاوية تدعم الحقن Context And Dependnecy Injection) فيمكن استخدام وحدة التثبيت باسمها (القيمة الموجودة في name داخل الملف) كما يلي:
import javax.persistence.*;
.
.
.
EntityManagerFactory entityManagerFactory  =
    Persistence.createEntityManagerFactory("hrPU");
EntityManager entityManager = 
   entityManagerFactory.createEntityManager();
حيث تستخدم entityManager لتخزين وقراءة أسطر جداول قاعدة البيانات على شكل أغراض من الاصناف المعرفة كـEntities، طريقة استخدام EntityManager خارج مجال هذه التدوينة.
بانتظار أي ملاحظات، ويسعدني أن أجيب على أي تساؤل

التسميات: