JPA Relations
الـ JPA (Java Persistence API) توفر العديد من الأنوتيشنات التي تُستخدم في تحديد العلاقات بين الكائنات في قاعدة البيانات. سأشرح الأنوتيشنات الخاصة بالعلاقات (مثل @OneToOne, @OneToMany, @ManyToOne, @ManyToMany) بشكل مفصل مع الحقول التي تأخذها ومعانيها.
1. @OneToOne
الوصف:
يُستخدم هذا الأنوتيشن لتمثيل علاقة واحد إلى واحد بين كائنين. بمعنى أن كل كائن في الكائن الأول مرتبط بكائن واحد فقط في الكائن الثاني.
الحقول المستخدمة:
mappedBy:
- هذا الحقل يُستخدم في الجهة "العكسية" للعلاقة لتحديد الحقل الذي يحتوي على العلاقة. يُستخدم على الكائن الذي لا يمتلك المفتاح الأجنبي.
- مثال: في العلاقة بين
PersonوPassport، سيتم تعيينmappedBy = "person"في كائنPassport.
@JoinColumn:
- يُستخدم لتحديد العمود الذي يحتوي على المفتاح الأجنبي في الجدول المرتبط.
- مثال: في
Passport، يُستخدم هذا لتحديد العمود الذي يشير إلىPerson.
مثال:
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(mappedBy = "person")
private Passport passport;
// Getters and setters
}
@Entity
public class Passport {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String passportNumber;
@OneToOne
@JoinColumn(name = "person_id")
private Person person;
// Getters and setters
}
2. @OneToMany
الوصف:
يُستخدم هذا الأنوتيشن لتمثيل علاقة واحد إلى كثير، حيث يرتبط كائن واحد بعدة كائنات. في العادة، نستخدمه في الجهة التي تحتوي على "المالك" أو "المؤسسة" التي تربط العديد من الكائنات الأخرى.
الحقول المستخدمة:
mappedBy:
- يُستخدم لتحديد الحقل في الكائن الآخر الذي يمتلك المفتاح الأجنبي (العلاقة العكسية).
- مثال: في مثال
DepartmentوEmployee، يكونmappedBy = "department"فيDepartment.
cascade:
- يُستخدم لتحديد العمليات التي سيتم تطبيقها تلقائيًا على الكائنات المرتبطة (مثل حفظ، تحديث، حذف).
- مثال: يمكن تحديد
cascade = CascadeType.ALLلكي تُطبق العمليات على الكائنات المرتبطة.
مثال:
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
// Getters and setters
}
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and setters
}
3. @ManyToOne
الوصف:
يُستخدم هذا الأنوتيشن لتمثيل علاقة كثير إلى واحد، حيث يرتبط العديد من الكائنات بكائن واحد. في العادة، يُستخدم في الكائنات التي تحتوي على المفتاح الأجنبي.
الحقول المستخدمة:
- @JoinColumn:
- يُستخدم لتحديد العمود الذي يحتوي على المفتاح الأجنبي.
- مثال: في
Employee، نحدد أنdepartment_idهو العمود الذي يشير إلىDepartment.
مثال:
@Entity
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String orderDetails;
@ManyToOne
@JoinColumn(name = "customer_id")
private Customer customer;
// Getters and setters
}
@Entity
public class Customer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and setters
}
4. @ManyToMany
الوصف:
يُستخدم هذا الأنوتيشن لتمثيل علاقة كثير إلى كثير بين كائنين. في هذا النوع من العلاقة، يتم ربط العديد من الكائنات في كلا الجانبين، مما يتطلب عادةً جدول ربط (join table).
الحقول المستخدمة:
mappedBy:
- يُستخدم في الجهة العكسية للعلاقة لتحديد الحقل الذي يمتلك العلاقة من الجهة الأخرى.
- مثال: في العلاقة بين
StudentوCourse، سيكونmappedBy = "students"فيCourse.
@JoinTable:
- يُستخدم لتحديد جدول الربط الذي يحفظ العلاقة بين الكائنات في الجانبين. يحتوي على عمودي
joinColumnsوinverseJoinColumnsلتحديد كيفية ربط الكائنات. - مثال: في العلاقة بين
StudentوCourse، نستخدم@JoinTableلتحديد جدول ربط مثلstudent_course.
- يُستخدم لتحديد جدول الربط الذي يحفظ العلاقة بين الكائنات في الجانبين. يحتوي على عمودي
مثال:
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// Getters and setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String courseName;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// Getters and setters
}
خلاصة
- @OneToOne: يُستخدم لتمثيل علاقة واحد إلى واحد بين كائنين.
- @OneToMany: يُستخدم لتمثيل علاقة واحد إلى كثير حيث يرتبط كائن واحد بعدة كائنات.
- @ManyToOne: يُستخدم لتمثيل علاقة كثير إلى واحد حيث يرتبط العديد من الكائنات بكائن واحد.
- @ManyToMany: يُستخدم لتمثيل علاقة كثير إلى كثير حيث يرتبط العديد من الكائنات في كلا الجانبين.
كل هذه الأنوتيشنات تستخدم لتحديد نوع العلاقة بين الكائنات وكيفية تعامل JPA مع تلك العلاقات في قاعدة البيانات.