الأربعاء، 13 نوفمبر 2019

التخطيط المتقدم JPA - Advanced Mappings

التخطيط المتقدم JPA - Advanced Mappings

التخطيط المتقدم JPA - Advanced Mappings
JPA هي مكتبة تم إصدارها بمواصفات java.  لذلك ، يدعم كل المفاهيم الموجهة للكائنات لاستمرار الكيان.  حتى الآن لقد انتهينا من أساسيات رسم الخرائط الكائن العلائقية.  يأخذك هذا الفصل خلال التعيينات المتقدمة بين الكائنات والكيانات العلائقية.

 استراتيجيات الوراثة
 الوراثة هي المفهوم الأساسي للغة الموجهة للكائنات ، وبالتالي يمكننا استخدام علاقات الوراثة أو الاستراتيجيات بين الكيانات.  يدعم JPA ثلاثة أنواع من استراتيجيات الميراث مثل SINGLE_TABLE و JOINED_TABLE و TABLE_PER_CONCRETE_CLASS.

 دعنا نفكر في مثال على صفوف أعضاء هيئة التدريس وفصول التدريس و NonTeachingStaff وعلاقاتهم كما يلي:

في الرسم التوضيحي الموضح أعلاه ، يعد الموظفون كيانًا ، و TeachingStaff و NonTeachingStaff هما الكيانان الفرعيان للموظفين.  هنا سنناقش المثال أعلاه في جميع الاستراتيجيات الثلاثة للميراث.

 استراتيجية جدول واحد
 تأخذ استراتيجية الجدول المفرد جميع حقول الفئات (كلا الفصول الفائقة والفرعية) وتعيينها في جدول واحد يُعرف باسم استراتيجية SINGLE_TABLE.  تلعب قيمة التمييز هنا دورًا رئيسيًا في التمييز بين قيم الكيانات الثلاثة في جدول واحد.

 دعنا نأخذ في الاعتبار المثال أعلاه ، TeachingStaff و NonTeachingStaff هما الفصول الفرعية لموظفي الفصل.  ذكِّر مفهوم الميراث (هو آلية وراثة لخصائص الفئة الفائقة حسب الفئة الفرعية) ، وبالتالي فإن sID ، هي الحقول التي تنتمي إلى كل من TeachingStaff و NonTeachingStaff.  إنشاء مشروع JPA.  جميع وحدات هذا المشروع هي كما يلي:

 إنشاء الكيانات
 قم بإنشاء حزمة باسم "com.ahmedalmahallawi.eclipselink.entity" ضمن حزمة "src".  إنشاء فئة جافا جديدة باسم Staff.java تحت معين ...


package com.ahmedalmahallawi.eclipselink.entity;

import java.io.Serializable;

import javax.persistence.DiscriminatorColumn;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.SINGLE_TABLE )
@DiscriminatorColumn( name = "type" )

public class Staff implements Serializable {
   @Id
   @GeneratedValue( strategy = GenerationType.AUTO )
   
   private int sid;
   private String sname;
   
   public Staff( int sid, String sname ) {
      super( );
      this.sid = sid;
      this.sname = sname;
   }
   
   public Staff( ) {
      super( );
   }
   
   public int getSid( ) {
      return sid;
   }
   
   public void setSid( int sid ) {
      this.sid = sid;
   }
   
   public String getSname( ) {
      return sname;
   }
   
   public void setSname( String sname ) {
      this.sname = sname;
   }
}


في الكود أعلاهDescriminatorColumn ، يُظهر اسم الحقل (النوع) وقيمه الحقول المتبقية (Teaching and NonTeachingStaff) المتبقية.

 إنشاء فئة فرعية (فئة) إلى فئة الموظفين المسمى TeachingStaff.java ضمن الحزمة com.ahmedalmahallawi.eclipselink.entity.  يتم عرض فئة هيئة التدريس على النحو التالي:

package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value="TS" )
public class TeachingStaff extends Staff {

   private String qualification;
   private String subjectexpertise;

   public TeachingStaff( int sid, String sname, 
   
   String qualification,String subjectexpertise ) {
      super( sid, sname );
      this.qualification = qualification;
      this.subjectexpertise = subjectexpertise;
   }

   public TeachingStaff( ) {
      super( );
   }

   public String getQualification( ){
      return qualification;
   }

   public void setQualification( String qualification ){
      this.qualification = qualification;
   }

   public String getSubjectexpertise( ) {
      return subjectexpertise;
   }

   public void setSubjectexpertise( String subjectexpertise ){
      this.subjectexpertise = subjectexpertise;
   }
}

إنشاء فئة فرعية (فئة) إلى فئة الموظفين المسمى NonTeachingStaff.java ضمن الحزمة com.ahmedalmahallawi.eclipselink.entity.  يتم عرض فئة كيان NonTeachingStaff على النحو التالي:
package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
@DiscriminatorValue( value = "NS" )

public class NonTeachingStaff extends Staff {
   private String areaexpertise;

   public NonTeachingStaff( int sid, String sname, String areaexpertise ) {
      super( sid, sname );
      this.areaexpertise = areaexpertise;
   }

   public NonTeachingStaff( ) {
      super( );
   }

   public String getAreaexpertise( ) {
      return areaexpertise;
   }

   public void setAreaexpertise( String areaexpertise ){
      this.areaexpertise = areaexpertise;
   }
}

Persistence.xml
 يحتوي ملف Persistence.xml على معلومات التكوين لقاعدة البيانات ومعلومات التسجيل لفئات الكيانات.  يظهر ملف xml كالتالي:
xml version="1.0" encoding="UTF-8"?>

 version="2.0" xmlns="http://java.sun.com/xml/ns/persistence"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence 
   http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    name="Eclipselink_JPA" transaction-type="RESOURCE_LOCAL">
   
      com.ahmedalmahallawi.eclipselink.entity.Staff
com.ahmedalmahallawi.eclipselink.entity.NonTeachingStaff com.ahmedalmahallawi.eclipselink.entity.TeachingStaff name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/jpadb"/> name="javax.persistence.jdbc.user" value="root"/> name="javax.persistence.jdbc.password" value="root"/> name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/> name="eclipselink.logging.level" value="FINE"/> name="eclipselink.ddl-generation" value="create-tables"/>

فئة الخدمة se
 فئات الخدمة هي جزء تنفيذ مكون الأعمال.  قم بإنشاء حزمة تحت حزمة 'src باسم' com.ahmedalmahallawi.eclipselink.service '.

 قم بإنشاء فصل دراسي باسم SaveClient.java ضمن الحزمة المحددة لتخزين حقول فئة الموظفين و TeachingStaff و NonTeachingStaff.  يتم عرض


package com.ahmedalmahallawi.eclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import com.ahmedalmahallawi.eclipselink.entity.NonTeachingStaff;
import com.ahmedalmahallawi.eclipselink.entity.TeachingStaff;

public class SaveClient {

   public static void main( String[ ] args ) {
   
      EntityManagerFactory emfactory = Persistence.createEntityManagerFactory( "Eclipselink_JPA" );
      EntityManager entitymanager = emfactory.createEntityManager( );
      entitymanager.getTransaction( ).begin( );

      //Teaching staff entity 
      TeachingStaff ts1=new TeachingStaff(1,"Gopal","MSc MEd","Maths");
      TeachingStaff ts2=new TeachingStaff(2, "Manisha", "BSc BEd", "English");
      
      //Non-Teaching Staff entity
      NonTeachingStaff nts1=new NonTeachingStaff(3, "Satish", "Accounts");
      NonTeachingStaff nts2=new NonTeachingStaff(4, "Krishna", "Office Admin");

      //storing all entities
      entitymanager.persist(ts1);
      entitymanager.persist(ts2);
      entitymanager.persist(nts1);
      entitymanager.persist(nts2);
      
      entitymanager.getTransaction().commit();
      
      entitymanager.close();
      emfactory.close();
   }
}



بعد تجميع وتنفيذ البرنامج أعلاه ، سوف تحصل على إشعارات في لوحة التحكم الخاصة بـ Eclipse IDE. تحقق من MySQL طاولة العمل للإخراج. يظهر الإخراج في تنسيق جدول كما يلي:
SidTypeSnameAreaexpertiseQualificationSubjectexpertise
1TSGopalMSC MEDMaths
2TSManishaBSC BEDEnglish
3NSSatishAccounts
4NSKrishnaOffice Admin


 أخيرًا ستحصل على جدول واحد يحتوي على حقول الصفوف الثلاثة ويختلف مع عمود التمييز المسمى "النوع".

 انضم الجدول استراتيجية
 تتمثل استراتيجية الجدول المنضم في مشاركة العمود المشار إليه والذي يحتوي على قيم فريدة للانضمام إلى الجدول وإجراء معاملات سهلة.  دعونا نفكر في نفس المثال على النحو الوارد أعلاه.

 إنشاء مشروع JPA.  جميع وحدات المشروع الموضحة كالتالي:

 إنشاء الكيانات
 قم بإنشاء حزمة باسم "com.ahmedalmahallawi.eclipselink.entity" ضمن حزمة "src".  قم بإنشاء فئة java جديدة باسم Staff.java ضمن الحزمة المحددة.  يتم عرض فئة كيان الموظفين على النحو التالي:

      entitymanager.getTransaction().commit();
      entitymanager.close();
      emfactory.close();
   }
}

بعد تجميع وتنفيذ البرنامج أعلاه ، سوف تحصل على إشعارات في لوحة التحكم الخاصة بـ Eclipse IDE.  للتحقق من الإخراج ، منضدة عمل MySQL كما يلي:

 هنا يتم إنشاء ثلاثة جداول وتظهر نتيجة جدول الموظفين في شكل جدول على النحو التالي:

SidDtypeSname
1TeachingStaffGopal
2TeachingStaffManisha
3NonTeachingStaffSatish
4NonTeachingStaffKrishna

تظهر نتيجة جدول TeachingStaff بتنسيق جدولي كما يلي:

SidQualificationSubjectexpertise
1MSC MEDMaths
2BSC BEDEnglish

في الجدول أعلاه ، يعد sid هو المفتاح الخارجي (جدول الموظفين في حقل نموذج مرجعي). تظهر نتيجة جدول NonTeachingStaff في شكل جدول كما يلي:

SidAreaexpertise
3Accounts
4Office Admin

أخيرًا ، يتم إنشاء الجداول الثلاثة باستخدام حقولهم على التوالي ، ويتم مشاركة حقل SID بواسطة الجداول الثلاثة.  جدول الموظفين هو مفتاح أساسي ، في الجداول المتبقية (TeachingStaff و NonTeachingStaff) SID هو مفتاح خارجي.

 الجدول حسب استراتيجية الصف
 استراتيجية الجدول حسب الفئة هي إنشاء جدول لكل كيان فرعي.  سيتم إنشاء جدول الموظفين ولكنه سيحتوي على سجلات خالية.  يجب مشاركة قيم الحقول في جدول "الموظفين" بواسطة جداول التدريس و NonTeachingStaff.

 دعونا نفكر في نفس المثال على النحو الوارد أعلاه.  تظهر جميع وحدات هذا المشروع على النحو التالي:

 إنشاء الكيانات
 قم بإنشاء حزمة باسم "com.ahmedalmahallawi.eclipselink.entity" ضمن حزمة "src".  قم بإنشاء فئة java جديدة باسم Staff.java ضمن الحزمة المحددة.  يتم عرض فئة كيان الموظفين على النحو التالي:


package com.ahmedalmahallawi.eclipselink.entity;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;

@Entity
@Table
@Inheritance( strategy = InheritanceType.TABLE_PER_CLASS )

public class Staff implements Serializable {

   @Id
   @GeneratedValue( strategy = GenerationType.AUTO )

   private int sid;
   private String sname;

   public Staff( int sid, String sname ) {
      super( );
      this.sid = sid;
      this.sname = sname;
   }

   public Staff( ) {
      super( );
   }

   public int getSid( ) {
      return sid;
   }

   public void setSid( int sid ) {
      this.sid = sid;
   }

   public String getSname( ) {
      return sname;
   }

   public void setSname( String sname ) {
      this.sname = sname;
   }
}


إنشاء فئة فرعية (فئة) إلى فئة الموظفين المسمى TeachingStaff.java ضمن الحزمة com.ahmedalmahallawi.eclipselink.entity.  يتم عرض فئة هيئة التدريس على النحو التالي:



package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
public class TeachingStaff extends Staff {
   private String qualification;
   private String subjectexpertise;

   public TeachingStaff( int sid, String sname, String qualification, String subjectexpertise ) {
      super( sid, sname );
      this.qualification = qualification;
      this.subjectexpertise = subjectexpertise;
   }

   public TeachingStaff( ) {
      super( );
   }

   public String getQualification( ){
      return qualification;
   }
   
   public void setQualification( String qualification ) {
      this.qualification = qualification;
   }

   public String getSubjectexpertise( ) {
      return subjectexpertise;
   }

   public void setSubjectexpertise( String subjectexpertise ){
      this.subjectexpertise = subjectexpertise;
   }
}

إنشاء فئة فرعية (فئة) إلى فئة الموظفين المسمى NonTeachingStaff.java ضمن الحزمة com.ahmedalmahallawi.eclipselink.entity.  يتم عرض فئة كيان NonTeachingStaff على النحو التالي:

package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;

@Entity
public class NonTeachingStaff extends Staff {
   private String areaexpertise;

   public NonTeachingStaff( int sid, String sname, String areaexpertise ) {
      super( sid, sname );
      this.areaexpertise = areaexpertise;
   }

   public NonTeachingStaff( ) {
      super( );
   }

   public String getAreaexpertise( ) {
      return areaexpertise;
   }

   public void setAreaexpertise( String areaexpertise ) {
      this.areaexpertise = areaexpertise;
   }
}


Persistence.xml
 يحتوي ملف Persistence.xml على معلومات التكوين لقاعدة البيانات ومعلومات التسجيل لفئات الكيانات.  يظهر ملف xml كالتالي:


xml version="1.0" encoding = "UTF-8"?>
 version = "2.0" xmlns = "http://java.sun.com/xml/ns/persistence"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation = "http://java.sun.com/xml/ns/persistence 
   http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    name = "Eclipselink_JPA" transaction-type = "RESOURCE_LOCAL">
      com.ahmedalmahallawi.eclipselink.entity.Staff
com.ahmedalmahallawi.eclipselink.entity.NonTeachingStaff com.ahmedalmahallawi.eclipselink.entity.TeachingStaff name = "javax.persistence.jdbc.url" value = "jdbc:mysql://localhost:3306/jpadb"/> name = "javax.persistence.jdbc.user" value = "root"/> name = "javax.persistence.jdbc.password" value = "root"/> name = "javax.persistence.jdbc.driver" value = "com.mysql.jdbc.Driver"/> name = "eclipselink.logging.level" value = "FINE"/> name = "eclipselink.ddl-generation" value="create-tables"/>


فئة الخدمة
 فئات الخدمة هي جزء تنفيذ مكون الأعمال.  قم بإنشاء حزمة تحت حزمة 'src باسم' com.ahmedalmahallawi.eclipselink.service '.

 قم بإنشاء فصل دراسي باسم SaveClient.java ضمن الحزمة المحددة لتخزين حقول فئة الموظفين و TeachingStaff و NonTeachingStaff.  يتم عرض فئة SaveClient على النحو التالي










التسميات: