الخميس، 14 نوفمبر 2019

علاقات الكيانات جي بي آي JPA - Entity Relationships

علاقات الكيانات جي بي آي JPA - Entity Relationships

علاقات الكيانات جي بي آي JPA - Entity Relationships
عندما تتكلم عن علاقات الكيانات Entity Relationship 
فنحن نتكلم عن لغة الإستعلام البنيوية للبيانات  اس كيو ال SQL يمكنك القراءة عنها هنا من خلال الرابط التالي SQL  


يأخذك هذا الفصل خلال العلاقات بين الكيانات.  بشكل عام ، تكون العلاقات أكثر فاعلية بين الجداول في قاعدة البيانات.  هنا يتم التعامل مع فئات الكيانات كجداول علائقية (مفهوم JPA) ، وبالتالي فإن العلاقات بين فئات الكيان هي كما يلي:

1  ManyToOne@ العلاقة
2  OneToMany@ العلاقة
3  OneToOne@ العلاقة
4  ManyToMany@ العلاقة

اولا  ManyToOne@ العلاقة


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

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

 يوضح الشكل علاقة أطراف متعددة كما يلي:



قم بإنشاء مشروع JPA في الكسوف IDE باسم JPA_Eclipselink_MTO.  جميع وحدات هذا المشروع موضحة كالتالي:

 إنشاء الكيانات create entities
 اتبع الرسم البياني أعلاه لإنشاء الكيانات.  قم بإنشاء حزمة باسم "com.ahmedalmahallawi.eclipselink.entity" ضمن حزمة "src".  قم بإنشاء فصل باسم Department.java ضمن الحزمة المحددة.  يظهر كيان قسم الفصل على النحو التالي:


package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Department {

   @Id 
   @GeneratedValue( strategy=GenerationType.AUTO )

   private int id;
   private String name;

   public int getId() {
      return id;
   }

   public void setId(int id) {
      this.id = id;
   }

   public String getName( ){
      return name;
   }

   public void setName( String deptName ){
      this.name = deptName;
   }
}



قم بإنشاء الكيان الثاني في هذه العلاقة - فئة كيان الموظف المسمى Employee.java ضمن حزمة "com.ahmedalmahallawi.eclipselink.entity".  تظهر فئة كيان الموظف على النحو التالي:

package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Employee{

   @Id
   @GeneratedValue( strategy= GenerationType.AUTO )  
   
   private int eid;
   private String ename;
   private double salary;
   private String deg;
   
   @ManyToOne
   private Department department;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid)  {
      this.eid = eid;
   }

   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   }

   public Department getDepartment() {
      return department;
   }

   public void setDepartment(Department department) {
      this.department = department;
   }
}



Persistence.xml
 مطلوب ملف Persistence.xml لتكوين قاعدة البيانات وتسجيل فئات الكيانات.

 سيتم إنشاء Persitence.xml بواسطة eclipse IDE أثناء إنشاء مشروع JPA.  تفاصيل التكوين هي مواصفات المستخدم.  يتم عرض ملف persistence.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.Employee
com.ahmedalmahallawi.eclipselink.entity.Department 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 '.  يتم إنشاء فئة DAO المسمى ManyToOne.java ضمن الحزمة المحددة.  يتم عرض فئة DAO كالتالي:

package com.ahmedalmahallawieclipselink.service;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.ahmedalmahallawi.eclipselink.entity.Department;
import com.ahmedalmahallawi.eclipselink.entity.Employee;

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

   //Create Department Entity
   Department department = new Department();
   department.setName("Development");
   
   //Store Department
   entitymanager.persist(department);

   //Create Employee1 Entity
   Employee employee1 = new Employee();
   employee1.setEname("Satish");
   employee1.setSalary(45000.0);
   employee1.setDeg("Technical Writer");
   employee1.setDepartment(department);

   //Create Employee2 Entity
   Employee employee2 = new Employee();
   employee2.setEname("Krishna");
   employee2.setSalary(45000.0);
   employee2.setDeg("Technical Writer");
   employee2.setDepartment(department);

   //Create Employee3 Entity
   Employee employee3 = new Employee();
   employee3.setEname("Masthanvali");
   employee3.setSalary(50000.0);
   employee3.setDeg("Technical Writer");
   employee3.setDepartment(department);

   //Store Employees
   entitymanager.persist(employee1);
   entitymanager.persist(employee2);
   entitymanager.persist(employee3);

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

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

 تمرير الاستعلام التالي في واجهة MySQL وتظهر نتيجة جدول القسم في تنسيق جدول كما يلي في الاستعلام:

Select * from department;

Id Name
101 Development

تمرير الاستعلام التالي في واجهة MySQL وتظهر نتيجة جدول الموظف في شكل جدول على النحو التالي في الاستعلام:
Select * from employee;

Eid Deg                 Ename         Salary Department_Id
102 Technical Writer Satish         45000 101
103 Technical Writer Krishna         45000 101
104 Technical Writer Masthan Wali 50000 101


في الجدول أعلاه ، Deparment_Id هو المفتاح الأجنبي  (الحقل المرجعي) من جدول Department.

 ثانيا OneToMany@ العلاقة
 في هذه العلاقة ، يُشار إلى كل صف من كيان واحد بالعديد من السجلات الفرعية في كيان آخر.  الشيء المهم هو أن سجلات الأطفال لا يمكن أن يكون لها عدة آباء  في علاقة رأس بأطراف بين الجدول (أ) والجدول (ب) ، يرتبط كل صف في الجدول (أ) بـ 0 أو 1 أو العديد من الصفوف في الجدول (ب).

 لننظر في المثال أعلاه.  إذا كان الموظف والقسم بطريقة عكسية أحادية الاتجاه ، فإن العلاقة هي علاقة أطراف بأطراف.  قم بإنشاء مشروع JPA في الكسوف IDE باسم JPA_Eclipselink_OTM.  جميع وحدات هذا المشروع موضحة كالتالي:

 إنشاء الكيانات
 اتبع الرسم البياني أعلاه لإنشاء الكيانات.  قم بإنشاء حزمة باسم "com.ahmedalmahallawi.eclipselink.entity" ضمن حزمة "src".  قم بإنشاء فصل باسم Department.java ضمن الحزمة المحددة.  يظهر كيان قسم الفصل على النحو التالي:
package com.ahmedalmahallawi.eclipselink.entity;

import java.util.List;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Department {

    @Id 
    @GeneratedValue( strategy=GenerationType.AUTO )
    
    private int id;
    private String name;
    
    @OneToMany( targetEntity=Employee.class )
    private List employeelist;

    public int getId() {
     return id;
    }
    
    public void setId(int id) {
     this.id = id;
    }
    
    public String getName( ) {
     return name;
    }
    
    public void setName( String deptName ) {
     this.name = deptName;
    }

    public List getEmployeelist() {
      return employeelist;
    }

   public void setEmployeelist(List employeelist) {
      this.employeelist = employeelist;
   }
}


قم بإنشاء الكيان الثاني في هذه العلاقة - فئة كيان الموظف ، المسمى Employee.java ضمن حزمة "com.ahmedalmahallawi.eclipselink.entity".  تظهر فئة كيان الموظف على النحو التالي:

package com.ahmedalmahallawi.eclipselink.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Employee {

   @Id
   @GeneratedValue( strategy= GenerationType.AUTO )  

   private int eid;
   private String ename;
   private double salary;
   private String deg;

   public Employee(int eid, String ename, double salary, String deg) {
      super( );
      this.eid = eid;
      this.ename = ename;
      this.salary = salary;
      this.deg = deg;
   }

   public Employee( ) {
      super();
   }

   public int getEid( ) {
      return eid;
   }
   
   public void setEid(int eid) {
      this.eid = eid;
   }

   public String getEname( ) {
      return ename;
   }
   
   public void setEname(String ename) {
      this.ename = ename;
   }

   public double getSalary( ) {
      return salary;
   }
   
   public void setSalary(double salary) {
      this.salary = salary;
   }

   public String getDeg( ) {
      return deg;
   }
   
   public void setDeg(String deg) {
      this.deg = deg;
   } 
}

Persistence.xml
 سيتم إنشاء Persistence.xml بواسطة eclipse IDE أثناء إنشاء مشروع JPA.  تفاصيل التكوين هي مواصفات المستخدم.  يتم عرض ملف persistence.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.Employee
com.ahmedalmahallawi.eclipselink.entity.Department 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 '.  يتم إنشاء فئة DAO المسمى OneToMany.java ضمن الحزمة المحددة.  يتم عرض فئة DAO كالتالي:

package com.ahmedalmahallawieclipselink.service;

import java.util.List;
import java.util.ArrayList;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import com.ahmedalmahallawi.eclipselink.entity.Department;
import com.ahmedalmahallawi.eclipselink.entity.Employee;

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

   //Create Employee1 Entity
   Employee employee1 = new Employee();
   employee1.setEname("Satish");
   employee1.setSalary(45000.0);
   employee1.setDeg("Technical Writer");

   //Create Employee2 Entity
   Employee employee2 = new Employee();
   employee2.setEname("Krishna");
   employee2.setSalary(45000.0);
   employee2.setDeg("Technical Writer");

   //Create Employee3 Entity
   Employee employee3 = new Employee();
   employee3.setEname("Masthanvali");
   employee3.setSalary(50000.0);
   employee3.setDeg("Technical Writer");

   //Store Employee
   entitymanager.persist(employee1);
   entitymanager.persist(employee2);
   entitymanager.persist(employee3);

   //Create Employeelist
   List<Employee> emplist = new ArrayList();
   emplist.add(employee1);
   emplist.add(employee2);
   emplist.add(employee3);

   //Create Department Entity
   Department department = new Department();
   department.setName("Development");
   department.setEmployeelist(emplist);

   //Store Department
   entitymanager.persist(department);

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

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

 تمرير الاستعلام التالي في واجهة MySQL ، وتظهر نتيجة جدول department_employee بتنسيق جدولي كما يلي في الاستعلام:

Select * from department_Id;

Department_Id Employee_Eid
254         251
254         252
254         253

في الجدول أعلاه ، تعد الحقول deparment_id و employee_id هي المفاتيح الخارجية (الحقول المرجعية) من جداول الأقسام والموظفين.

 تمرير الاستعلام التالي في واجهة MySQL وتظهر نتيجة جدول القسم في شكل جدول على النحو التالي في الاستعلام:

Select * from department;

Id Name
254 Development

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

Select * from employee;

Eid Deg                 Ename        Salary
251 Technical Writer Satish        45000
252 Technical Writer Krishna        45000
253 Technical Writer Masthanvali    50000


 ثالثا OneToOne@ العلاقة









التسميات: