JPA (Java Persistence API)-তে ডেটাবেসে সম্পর্কিত টেবিলগুলোর মধ্যে সম্পর্ক ম্যানেজ করার জন্য বিভিন্ন relationship mapping ব্যবহৃত হয়। JPA-এর মাধ্যমে, আপনি Entity গুলোর মধ্যে সম্পর্ক সুনির্দিষ্ট করতে পারেন, যেমন One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many। এই সম্পর্কগুলো ডেটাবেসের মধ্যে টেবিলগুলোর মধ্যে একাধিক রিলেশন তৈরি করে, যাতে ডেটা ম্যানিপুলেশন সহজ হয়।
JPA সম্পর্কের ম্যাপিং সাধারণত annotations ব্যবহার করে করা হয়।
১. One-to-One Relationship
একটি One-to-One সম্পর্কের মধ্যে, একটি Entity এর সাথে আরেকটি Entity সম্পর্কিত থাকে, যেখানে একটি রেকর্ড অন্য একটি রেকর্ডের সাথে একত্রিত থাকে।
প্রয়োগ:
ধরা যাক, একটি User Entity এবং একটি Profile Entity এর মধ্যে One-to-One সম্পর্ক আছে, যেখানে এক জন ব্যবহারকারীর একটি প্রোফাইল থাকবে।
User Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class User {
@Id
private int id;
private String name;
@OneToOne(mappedBy = "user")
private Profile profile;
// Getters and Setters
}
Profile Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Profile {
@Id
private int id;
private String bio;
@OneToOne
private User user;
// Getters and Setters
}
এখানে:
@OneToOne:UserএবংProfileএর মধ্যে One-to-One সম্পর্ক তৈরি করছে।mappedBy: এই অ্যানোটেশনটি সম্পর্কের মালিককে নির্ধারণ করে, যেখানেProfileEntity সম্পর্কের মালিক।
ডেটাবেস টেবিল:
- User Table: id, name
- Profile Table: id, bio, user_id (Foreign Key to User)
২. One-to-Many Relationship
একটি One-to-Many সম্পর্কের মধ্যে, একটি Entity এর একাধিক রেকর্ড অন্য একটি Entity এর সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, এক জন Department এর মধ্যে একাধিক Employee থাকতে পারে।
প্রয়োগ:
Department Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Department {
@Id
private int id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// Getters and Setters
}
Employee Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private int id;
private String name;
@ManyToOne
private Department department;
// Getters and Setters
}
এখানে:
@OneToMany:DepartmentএবংEmployeeএর মধ্যে One-to-Many সম্পর্ক তৈরি হচ্ছে।mappedBy:EmployeeEntity-তে Many-to-One সম্পর্কের মাধ্যমেDepartmentEntity এর সাথে সম্পর্ক গঠন করছে।
ডেটাবেস টেবিল:
- Department Table: id, name
- Employee Table: id, name, department_id (Foreign Key to Department)
৩. Many-to-One Relationship
একটি Many-to-One সম্পর্কের মধ্যে, একাধিক Entity এর সাথে একটি Entity সম্পর্কিত থাকে। এটি মূলত One-to-Many সম্পর্কের বিপরীত। উদাহরণস্বরূপ, একাধিক Employee একটি Department এর সাথে সম্পর্কিত।
প্রয়োগ:
Employee Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private int id;
private String name;
@ManyToOne
private Department department;
// Getters and Setters
}
Department Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Department {
@Id
private int id;
private String name;
// Getters and Setters
}
এখানে:
@ManyToOne:EmployeeএবংDepartmentএর মধ্যে Many-to-One সম্পর্ক তৈরি করছে, যেখানে একাধিক Employee একটি Department এর সাথে সম্পর্কিত।
ডেটাবেস টেবিল:
- Employee Table: id, name, department_id (Foreign Key to Department)
- Department Table: id, name
৪. Many-to-Many Relationship
একটি Many-to-Many সম্পর্কের মধ্যে, একটি Entity এর একাধিক রেকর্ড অন্য Entity এর একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একাধিক Student বিভিন্ন Course এর সাথে সম্পর্কিত হতে পারে এবং একাধিক Course একাধিক Student এর সাথে সম্পর্কিত।
প্রয়োগ:
Student Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany(mappedBy = "students")
private List<Course> courses;
// Getters and Setters
}
Course Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Course {
@Id
private int id;
private String name;
@ManyToMany
private List<Student> students;
// Getters and Setters
}
এখানে:
@ManyToMany:StudentএবংCourseএর মধ্যে Many-to-Many সম্পর্ক তৈরি করছে।mappedBy:CourseEntity-তেstudentsনামক প্রপার্টি দ্বারা সম্পর্কটি ব্যাখ্যা করা হয়েছে।
ডেটাবেস টেবিল:
- Student Table: id, name
- Course Table: id, name
- Student_Course Table (Join Table): student_id, course_id (Foreign Keys)
৫. Cascade Types in JPA Relationships
JPA সম্পর্কের মাধ্যমে Cascade Types ব্যবহার করে আপনি এক Entity এর পরিবর্তনে সম্পর্কিত অন্য Entity এর উপর পরিবর্তন প্রয়োগ করতে পারেন। Cascade Types ব্যবহৃত হয় একাধিক Entity একসাথে প্রক্রিয়া করার জন্য।
Cascade Types এর উদাহরণ:
CascadeType.ALL: সব অপারেশন (Persist, Merge, Remove) Cascade হয়।CascadeType.PERSIST: শুধুমাত্র Entity persistence (save) করতে Cascade হয়।CascadeType.MERGE: Entity merge করার সময় Cascade হয়।CascadeType.REMOVE: Entity remove করার সময় Cascade হয়।
@ManyToMany(cascade = CascadeType.ALL)
private List<Course> courses;
এখানে:
CascadeType.ALLব্যবহার করে, যখনStudentEntity-তে পরিবর্তন হবে, তখন সেই পরিবর্তনটি Course Entity তেও Cascade হবে।
সারাংশ
JPA এর Relationship Mapping শক্তিশালী ডেটাবেস ম্যানিপুলেশন ক্ষমতা প্রদান করে। One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কগুলোর সাহায্যে আপনি জটিল ডেটাবেস রিলেশনশিপ সুনির্দিষ্টভাবে ডিজাইন করতে পারবেন। JPA এর মাধ্যমে আপনি Entity, EntityManager, এবং Cascade Types ব্যবহার করে সম্পর্কিত ডেটা সহজে ম্যানেজ এবং পার্সিস্ট করতে পারেন, যা ডেটাবেসের সাথে সম্পর্কিত Entity গুলোর মধ্যে সঠিকভাবে সম্পর্ক স্থাপন করে।
JPA (Java Persistence API) ব্যবহার করে Java অ্যাপ্লিকেশনগুলিতে ডেটাবেস টেবিল এবং Java অবজেক্টের মধ্যে সম্পর্ক স্থাপন করা হয়। Entity Relationships হল একে অপরের সাথে সম্পর্কিত দুই বা তার বেশি Entity এর মধ্যে সংযোগ স্থাপন করার একটি ধারণা। JPA-তে Entity Relationship মূলত বিভিন্ন ধরণের One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের মাধ্যমে বাস্তবায়িত হয়।
ডেটাবেসে Entity এর মধ্যে সম্পর্ক বিভিন্নভাবে হতে পারে, এবং JPA এই সম্পর্কগুলো কীভাবে ম্যানেজ করতে হবে তা নির্ধারণ করার জন্য কিছু অ্যানোটেশন প্রদান করে। এই অ্যানোটেশনগুলির মাধ্যমে, আপনি বিভিন্ন Entity গুলির মধ্যে সম্পর্ক তৈরি এবং পরিচালনা করতে পারেন।
JPA Entity Relationships এর বিভিন্ন ধরনের সম্পর্ক
১. One-to-One Relationship
One-to-One (এক-থেকে-এক) সম্পর্ক হল একটি সম্পর্ক যেখানে একটি Entity আরেকটি Entity এর সাথে সম্পর্কিত থাকে। অর্থাৎ, এক Entity এর একটি রেকর্ডের সাথে আরেক Entity এর একটি রেকর্ড সম্পর্কিত থাকে। উদাহরণস্বরূপ, একজন কর্মচারী এবং তার প্রোফাইলের মধ্যে একটি One-to-One সম্পর্ক থাকতে পারে।
JPA উদাহরণ:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Employee {
@Id
private int id;
private String name;
@OneToOne
private EmployeeProfile profile;
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class EmployeeProfile {
@Id
private int id;
private String profileDetails;
// Getters and Setters
}
এখানে, Employee Entity একটি One-to-One সম্পর্ক স্থাপন করেছে EmployeeProfile Entity এর সাথে, যা ইঙ্গিত দেয় যে একজন কর্মচারীর একটি প্রোফাইল থাকবে।
২. One-to-Many Relationship
One-to-Many (এক-থেকে-অনেক) সম্পর্ক হল এমন একটি সম্পর্ক যেখানে একটি Entity একাধিক Entity এর সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, একটি বিভাগ (Department) এর সাথে অনেক কর্মচারী (Employee) থাকতে পারে।
JPA উদাহরণ:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Department {
@Id
private int id;
private String departmentName;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private int id;
private String name;
@ManyToOne
private Department department;
// Getters and Setters
}
এখানে, Department Entity অনেক Employee Entity এর সাথে সম্পর্কিত। mappedBy প্যারামিটারটি বলে দেয় যে Employee Entity তে এই সম্পর্কের মালিকানাটি থাকবে।
৩. Many-to-One Relationship
Many-to-One (অনেক-থেকে-এক) সম্পর্ক হল একটি সম্পর্ক যেখানে অনেক Entity একটি একক Entity এর সাথে সম্পর্কিত থাকে। এটি One-to-Many সম্পর্কের বিপরীত, যেখানে অনেক কর্মচারী একটি নির্দিষ্ট বিভাগের সাথে সম্পর্কিত থাকে।
JPA উদাহরণ:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private int id;
private String name;
@ManyToOne
private Department department;
// Getters and Setters
}
এখানে, Employee Entity এর মধ্যে অনেক কর্মচারী একটি নির্দিষ্ট Department এর সাথে সম্পর্কিত থাকবে।
৪. Many-to-Many Relationship
Many-to-Many (অনেক-থেকে-অনেক) সম্পর্ক হল এমন একটি সম্পর্ক যেখানে অনেক Entity একাধিক Entity এর সাথে সম্পর্কিত থাকে। উদাহরণস্বরূপ, অনেক ছাত্র (Student) বিভিন্ন কোর্স (Course) নিবন্ধন করতে পারে এবং প্রতিটি কোর্সে অনেক ছাত্র থাকতে পারে।
JPA উদাহরণ:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany
private List<Course> courses;
// Getters and Setters
}
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Course {
@Id
private int id;
private String courseName;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// Getters and Setters
}
এখানে, Student এবং Course Entity গুলোর মধ্যে একটি Many-to-Many সম্পর্ক স্থাপন করা হয়েছে। একটি ছাত্রের একাধিক কোর্স থাকতে পারে এবং প্রতিটি কোর্সে অনেক ছাত্র থাকতে পারে।
Cascade Types
JPA তে Cascade Types ব্যবহৃত হয় যাতে আপনি এক Entity এর উপর একটি অপারেশন করার সময় অন্যান্য সম্পর্কিত Entity গুলিতে একই অপারেশনটি cascade করে করতে পারেন।
Cascade Types এর উদাহরণ:
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
@Entity
public class Department {
@OneToMany(cascade = CascadeType.ALL)
private List<Employee> employees;
// Getters and Setters
}
এখানে, CascadeType.ALL দ্বারা Department Entity এর সাথে সম্পর্কিত Employee Entity গুলোর উপর একই অপারেশন (যেমন persist, merge, remove) cascade হয়ে যাবে।
Join Types in JPA
JPA তে JOIN সম্পর্ক তৈরি করার জন্য কিছু টেকনিক্যাল অ্যাপ্রোচ রয়েছে। যখন আপনি দুটি Entity এর মধ্যে সম্পর্ক তৈরি করেন, তখন JOIN অপারেশন ব্যবহার করা হয়।
Inner Join:
SELECT e FROM Employee e JOIN e.department d WHERE d.name = 'IT'
এখানে:
- INNER JOIN ফিল্টার হিসেবে ব্যবহৃত হচ্ছে যেখানে Employee Entity এবং Department Entity এর মধ্যে সম্পর্কের মাধ্যমে ডেটা ফেচ করা হচ্ছে।
সারাংশ
JPA (Java Persistence API) এর মাধ্যমে Entity Relationships ব্যবস্থাপনা করা সহজ এবং কার্যকরী। JPA অনেক ধরনের Entity সম্পর্ক সমর্থন করে, যেমন One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many। এছাড়া, Cascade Types এবং Join Types ব্যবহার করে Entity গুলির মধ্যে সম্পর্কের অপারেশনগুলো আরও কার্যকরভাবে করা যায়। JPA আপনার ডেটাবেস ডেভেলপমেন্টে ORM ব্যবহারের মাধ্যমে কোডের কমপ্লেক্সিটি কমাতে সহায়তা করে এবং ডেটাবেসের সাথে কার্যকরী সম্পর্ক স্থাপন করতে সাহায্য করে।
JPA (Java Persistence API) একটি ORM (Object-Relational Mapping) প্রযুক্তি যা Java ক্লাসগুলিকে ডেটাবেস টেবিলের সাথে সম্পর্কিত করতে সহায়তা করে। JPA-তে বিভিন্ন ধরনের সম্পর্ক প্রতিষ্ঠা করার জন্য অ্যানোটেশন ব্যবহৃত হয়। এগুলি @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany সম্পর্কের জন্য ব্যবহৃত অ্যানোটেশন।
এগুলির মাধ্যমে একটি অ্যাপ্লিকেশন ডেটাবেসে একাধিক টেবিলের মধ্যে সম্পর্ক স্থাপন করতে পারে। নিচে এই অ্যানোটেশনগুলির বিস্তারিত আলোচনা করা হলো।
১. @OneToOne (একটির সাথে একটির সম্পর্ক)
@OneToOne এনোটেশনটি ব্যবহার করা হয় যখন দুটি Entity এর মধ্যে একটির সাথে একটির সম্পর্ক থাকে। অর্থাৎ, একটি Entity অন্য একটি Entity এর সাথে সম্পর্কিত এবং সেই Entity একটি মাত্র রেকর্ডের সাথে সম্পর্কিত থাকে।
@OneToOne উদাহরণ:
ধরা যাক, একটি Person এবং একটি Passport Entity রয়েছে, যেখানে একজন ব্যক্তি শুধুমাত্র একটি পাসপোর্ট রাখবে এবং একটি পাসপোর্ট শুধুমাত্র একটি ব্যক্তির সাথে সম্পর্কিত থাকবে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
@Entity
public class Person {
@Id
private Long id;
private String name;
@OneToOne
private Passport passport; // One-to-One Relationship
// Getters and Setters
}
@Entity
public class Passport {
@Id
private Long passportId;
private String passportNumber;
@OneToOne(mappedBy = "passport")
private Person person; // Inverse Side of the relationship
// Getters and Setters
}
Explanation:
- @OneToOne: এখানে
PersonEntity-এPassportEntity এর সাথে একটির সাথে একটির সম্পর্ক স্থাপন করা হয়েছে। - mappedBy:
PassportEntity-তেmappedByব্যবহার করা হয়েছে, যা সম্পর্কের ইনভার্স সাইড নির্ধারণ করে।
২. @OneToMany (একটির সাথে অনেকগুলোর সম্পর্ক)
@OneToMany এনোটেশনটি ব্যবহার করা হয় যখন একটি Entity অনেকগুলো Entity এর সাথে সম্পর্কিত থাকে। এটি সাধারণত একটি Entity দ্বারা অনেকগুলি Entity রেকর্ডের মালিকানা প্রকাশ করে।
@OneToMany উদাহরণ:
ধরা যাক, একটি Department এবং অনেক Employee Entity রয়েছে, যেখানে একটি Department অনেক Employee এর সাথে সম্পর্কিত থাকবে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees; // One-to-Many Relationship
// Getters and Setters
}
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
private Department department; // Many-to-One Relationship
// Getters and Setters
}
Explanation:
- @OneToMany:
DepartmentEntity-এEmployeeEntity এর সাথে একটির সাথে অনেকগুলোর সম্পর্ক স্থাপন করা হয়েছে। - mappedBy:
EmployeeEntity-তেdepartmentফিল্ডটি সম্পর্কের মালিকানা ধারণ করে।
৩. @ManyToOne (অনেকগুলোর সাথে একটির সম্পর্ক)
@ManyToOne এনোটেশনটি ব্যবহার করা হয় যখন একটি Entity অনেকগুলোর সাথে সম্পর্কিত থাকে এবং সম্পর্কের মালিকানা অনেকগুলি Entity ধারণ করে, কিন্তু সেই Entity একটি রেকর্ডের সাথে সম্পর্কিত থাকে।
@ManyToOne উদাহরণ:
ধরা যাক, একাধিক Employee একটি Department এর সাথে সম্পর্কিত থাকবে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
private Department department; // Many-to-One Relationship
// Getters and Setters
}
Explanation:
- @ManyToOne:
EmployeeEntity-এDepartmentEntity এর সাথে অনেকগুলোর সাথে একটির সম্পর্ক স্থাপন করা হয়েছে। - এখানে, অনেক Employee একটি Department এর সাথে সম্পর্কিত।
৪. @ManyToMany (অনেকগুলোর সাথে অনেকগুলোর সম্পর্ক)
@ManyToMany এনোটেশনটি ব্যবহার করা হয় যখন দুটি Entity এর মধ্যে অনেকগুলোর সাথে অনেকগুলোর সম্পর্ক থাকে। অর্থাৎ, একটি Entity অনেকগুলি অন্য Entity এর সাথে সম্পর্কিত এবং সেই Entity এরাও অনেকগুলো Entity এর সাথে সম্পর্কিত থাকে।
@ManyToMany উদাহরণ:
ধরা যাক, একটি Student এবং একটি Course Entity রয়েছে, যেখানে একটি Student অনেকগুলি Course নিবন্ধন করতে পারে এবং একটি Course অনেকগুলি Student নিতে পারে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import java.util.List;
@Entity
public class Student {
@Id
private Long id;
private String name;
@ManyToMany
private List<Course> courses; // Many-to-Many Relationship
// Getters and Setters
}
@Entity
public class Course {
@Id
private Long id;
private String courseName;
@ManyToMany(mappedBy = "courses")
private List<Student> students; // Inverse Side of the relationship
// Getters and Setters
}
Explanation:
- @ManyToMany:
StudentEntity-এCourseEntity এর সাথে অনেকগুলোর সাথে অনেকগুলোর সম্পর্ক স্থাপন করা হয়েছে। - mappedBy:
CourseEntity-তেmappedByব্যবহার করা হয়েছে, যা সম্পর্কের ইনভার্স সাইড নির্ধারণ করে।
সারাংশ
JPA (Java Persistence API)-তে @OneToOne, @OneToMany, @ManyToOne, এবং @ManyToMany অ্যানোটেশনগুলি ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। এগুলি ডেটাবেসে সম্পর্কিত টেবিলের মধ্যে সম্পর্ক এবং একাধিক অবজেক্টকে সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়:
- @OneToOne: একটি Entity এবং আরেকটি Entity এর মধ্যে একটির সাথে একটির সম্পর্ক।
- @OneToMany: একটি Entity এবং অনেক Entity এর মধ্যে একটির সাথে অনেকগুলোর সম্পর্ক।
- @ManyToOne: অনেক Entity এবং একটি Entity এর মধ্যে অনেকগুলোর সাথে একটির সম্পর্ক।
- @ManyToMany: অনেক Entity এবং অনেক Entity এর মধ্যে অনেকগুলোর সাথে অনেকগুলোর সম্পর্ক।
এই অ্যানোটেশনগুলো JPA এবং ORM ডেভেলপমেন্টের গুরুত্বপূর্ণ অংশ হিসেবে কাজ করে এবং ডেটাবেস সম্পর্কের নকশা তৈরি করতে সাহায্য করে।
JPA (Java Persistence API) এর মধ্যে দুটি গুরুত্বপূর্ণ ধারণা হল CascadeType এবং FetchType। এই দুটি কনফিগারেশন ডেটাবেসের সাথে সম্পর্কিত অবজেক্ট এবং তাদের সম্পর্কিত ডেটা ম্যানিপুলেশন এবং লোডিং কন্ট্রোল করার জন্য ব্যবহৃত হয়।
CascadeType
CascadeType হল একটি কনফিগারেশন যা Entity সম্পর্কিত অন্য Entity গুলির ওপর CRUD (Create, Read, Update, Delete) অপারেশনগুলিকে ক্যাসকেড (propagate) করতে সহায়তা করে। যখন আপনি একটি Parent Entity-এর ওপর অপারেশন (যেমন, persist, merge, remove) করেন, তখন সম্পর্কিত Child Entity গুলিতে ঐ অপারেশনগুলো ক্যাসকেড হয়ে যাবে।
CascadeType এর প্রকার:
- CascadeType.PERSIST: Parent Entity কে persist করলে, সম্পর্কিত Child Entity গুলিও persist হবে।
- CascadeType.MERGE: Parent Entity কে merge করলে, সম্পর্কিত Child Entity গুলিও merge হবে।
- CascadeType.REMOVE: Parent Entity কে remove করলে, সম্পর্কিত Child Entity গুলিও remove হবে।
- CascadeType.REFRESH: Parent Entity কে refresh করলে, সম্পর্কিত Child Entity গুলিও refresh হবে।
- CascadeType.DETACH: Parent Entity কে detach করলে, সম্পর্কিত Child Entity গুলিও detach হবে।
- CascadeType.ALL: সব CascadeType গুলি একসাথে কার্যকরী হবে।
CascadeType এর উদাহরণ:
ধরা যাক, দুটি Entity ক্লাস Department এবং Employee রয়েছে যেখানে Department হল Parent Entity এবং Employee হল Child Entity।
import javax.persistence.*;
@Entity
public class Department {
@Id
private int id;
private String name;
@OneToMany(cascade = CascadeType.ALL)
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
private int id;
private String name;
// Getters and Setters
}
এখানে:
@OneToMany(cascade = CascadeType.ALL)এর মাধ্যমে Department Entity তে করা অপারেশনগুলো Employee Entity তে ক্যাসকেড হয়ে যাবে।- উদাহরণস্বরূপ, যদি একটি
DepartmentEntity তৈরি করা হয়, তবে এর সাথে সম্পর্কিত সবEmployeeEntity গুলোও একই সঙ্গে persist হবে, এবং যদিDepartmentEntity মুছে ফেলা হয়, তবে তার সাথে সম্পর্কিত সবEmployeeEntity গুলোও মুছে ফেলা হবে।
FetchType
FetchType হল একটি কনফিগারেশন যা JPA-তে Entity গুলোর লোডিং স্ট্র্যাটেজি কন্ট্রোল করে। FetchType দুটি প্রকারের হতে পারে:
- FetchType.EAGER: এটি সম্পর্কিত Entity গুলিকে সাথে সাথে লোড করে যখন Parent Entity লোড হয়।
- FetchType.LAZY: এটি সম্পর্কিত Entity গুলিকে ডেম্যান্ডে লোড করে, অর্থাৎ Parent Entity লোড হওয়ার পর শুধুমাত্র যখন প্রয়োজন হবে তখন সম্পর্কিত Entity গুলো লোড হবে।
FetchType এর উদাহরণ:
ধরা যাক, দুটি Entity ক্লাস Student এবং Course রয়েছে, যেখানে একজন Student একাধিক Course নিবন্ধন করতে পারে। আমরা চাই, যখন একটি Student লোড হবে তখন তার সাথে সম্পর্কিত Course গুলো Lazyভাবে লোড হোক।
import javax.persistence.*;
@Entity
public class Student {
@Id
private int id;
private String name;
@OneToMany(fetch = FetchType.LAZY)
private List<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
private int id;
private String courseName;
// Getters and Setters
}
এখানে:
@OneToMany(fetch = FetchType.LAZY)দ্বারা Course Entity গুলো Lazy লোড করা হয়েছে। এর মানে, যখনStudentEntity লোড হবে, তখনCourseEntity গুলো শুধুমাত্র তখনই লোড হবে যখনcoursesপ্রপার্টি অ্যাক্সেস করা হবে।
FetchType.EAGER উদাহরণ:
@Entity
public class Student {
@Id
private int id;
private String name;
@OneToMany(fetch = FetchType.EAGER)
private List<Course> courses;
// Getters and Setters
}
এখানে:
@OneToMany(fetch = FetchType.EAGER)দ্বারা Course Entity গুলো Eagerly লোড হবে, অর্থাৎ যখনStudentEntity লোড হবে তখন সাথে সাথেCourseEntity গুলোও লোড হবে।
CascadeType এবং FetchType এর পার্থক্য
- CascadeType ডেটাবেসের ওপর বিভিন্ন CRUD অপারেশনগুলিকে ক্যাসকেড করতে ব্যবহৃত হয়, অর্থাৎ Parent Entity-তে কোনো অপারেশন করলে তা Child Entity-তে প্রভাব ফেলবে।
- FetchType ডেটাবেস থেকে সম্পর্কিত Entity গুলির লোডিং স্ট্র্যাটেজি নিয়ন্ত্রণ করে। এটি নির্ধারণ করে যে, সম্পর্কিত Entity গুলো ডেটাবেস থেকে লোড করা হবে কখন এবং কীভাবে।
সারাংশ
CascadeType এবং FetchType JPA এর গুরুত্বপূর্ণ কনসেপ্ট যা ডেটাবেস ম্যানিপুলেশন এবং Entity গুলোর লোডিং কৌশলকে কন্ট্রোল করে। CascadeType ব্যবহার করে Parent Entity-তে করা অপারেশন গুলো Child Entity তে ক্যাসকেড করা যায়, এবং FetchType ব্যবহার করে সম্পর্কিত Entity গুলোকে Lazy বা Eagerly লোড করা যায়। এই কনসেপ্টগুলো JPA এর কার্যকারিতা এবং পারফরম্যান্সের জন্য গুরুত্বপূর্ণ ভূমিকা পালন করে এবং ডেটাবেস অপারেশনগুলোকে আরও কার্যকরী এবং নমনীয় করে তোলে।
JPA (Java Persistence API) রিলেশনাল ডেটাবেস এবং জাভা অবজেক্টের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। Bidirectional এবং Unidirectional সম্পর্ক হল Entity ক্লাসগুলির মধ্যে সম্পর্কের দুইটি গুরুত্বপূর্ণ ধারণা, যা জেভিএএ (JPA) ডাটাবেসের মধ্যে ডেটার অর্গানাইজেশন ও ম্যানিপুলেশনে সহায়তা করে।
এই সম্পর্কগুলি One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many রিলেশনশিপে প্রযোজ্য হয় এবং ডেটাবেসে টেবিলগুলির মধ্যে সম্পর্কের আর্কিটেকচার তৈরি করে।
Unidirectional Relationship
Unidirectional Relationship হলো এমন একটি সম্পর্ক যেখানে এক Entity থেকে অন্য Entity এর সাথে সম্পর্ক স্থাপন করা হয়, কিন্তু বিপরীত দিকে সম্পর্ক করা হয় না। অর্থাৎ, একটি Entity তার সম্পর্কিত Entity এর দিকে ইঙ্গিত করে, কিন্তু সেই Entity তার প্রথম Entity তে ফিরে আসার কোনো তথ্য রাখে না।
Unidirectional One-to-Many Relationship
এটি এমন একটি সম্পর্ক যেখানে একটি Entity এর অনেকগুলি সম্পর্কিত Entity থাকতে পারে, কিন্তু বিপরীত দিকে কোন সম্পর্ক নেই।
উদাহরণ: একে অনেকের সম্পর্ক (One-to-Many) - একটি ডিপার্টমেন্টে অনেক কর্মচারী থাকতে পারে, কিন্তু কর্মচারী জানবে না যে কোন ডিপার্টমেন্টে তারা কাজ করছে।
import javax.persistence.*;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
private Long id;
private String name;
// No reference to Department
}
এখানে:
- Department Entity এর মধ্যে
@OneToManyঅ্যানোটেশন ব্যবহার করা হয়েছে, যা নির্দেশ করে যে একটি ডিপার্টমেন্টে অনেক কর্মচারী থাকতে পারে। - Employee Entity তে কোনো Department অবজেক্ট নেই, অর্থাৎ এটি unidirectional।
Bidirectional Relationship
Bidirectional Relationship হলো এমন একটি সম্পর্ক যেখানে দুটি Entity একে অপরের দিকে সম্পর্ক স্থাপন করতে পারে। অর্থাৎ, একটি Entity অন্য Entity এর দিকে নির্দেশনা প্রদান করে, এবং বিপরীত দিকে সেই Entity দ্বিতীয় Entity এর দিকে নির্দেশনা প্রদান করতে পারে।
Bidirectional One-to-Many Relationship
এটি এমন একটি সম্পর্ক যেখানে একটি Entity এর অনেকগুলি সম্পর্কিত Entity থাকতে পারে এবং প্রতিটি সম্পর্কিত Entity তার মূল Entity এর দিকে ইঙ্গিত করে।
উদাহরণ: একে অনেকের সম্পর্ক (One-to-Many) - একটি ডিপার্টমেন্টের অনেক কর্মচারী থাকতে পারে, এবং প্রতিটি কর্মচারী জানবে তার কোন ডিপার্টমেন্টে কাজ করছে।
import javax.persistence.*;
@Entity
public class Department {
@Id
private Long id;
private String name;
@OneToMany(mappedBy = "department")
private List<Employee> employees;
// Getters and Setters
}
@Entity
public class Employee {
@Id
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
এখানে:
- Department Entity তে
@OneToMany(mappedBy = "department")দ্বারা কর্মচারীদের সাথে সম্পর্ক স্থাপন করা হয়েছে, যেখানেmappedByএর মাধ্যমে এটি Employee Entity এরdepartmentফিল্ড দ্বারা সম্পর্কিত। - Employee Entity তে
@ManyToOneঅ্যানোটেশন ব্যবহার করা হয়েছে, যেখানে কর্মচারী তাদের ডিপার্টমেন্টের দিকে ইঙ্গিত করে।
Bidirectional Many-to-Many Relationship
এটি এমন একটি সম্পর্ক যেখানে দুটি Entity একে অপরের মধ্যে অনেকগুলি সম্পর্ক স্থাপন করতে পারে।
উদাহরণ: অনেকের মধ্যে অনেকের সম্পর্ক (Many-to-Many) - একজন শিক্ষার্থী অনেক কোর্সে পড়তে পারে এবং একটি কোর্সে অনেক শিক্ষার্থী থাকতে পারে।
import javax.persistence.*;
import java.util.List;
@Entity
public class Student {
@Id
private Long id;
private String name;
@ManyToMany(mappedBy = "students")
private List<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
private Long id;
private String title;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "course_id"),
inverseJoinColumns = @JoinColumn(name = "student_id")
)
private List<Student> students;
// Getters and Setters
}
এখানে:
- Student Entity তে
@ManyToMany(mappedBy = "students")ব্যবহার করে কোর্সের সাথে সম্পর্ক তৈরি হয়েছে, যেখানেmappedByএর মাধ্যমে এটি Course Entity এরstudentsফিল্ড দ্বারা সম্পর্কিত। - Course Entity তে
@ManyToManyএবং@JoinTableব্যবহার করে শিক্ষার্থীদের সাথে সম্পর্ক তৈরি করা হয়েছে।@JoinTableটেবিলটি সম্পর্কিত কলামগুলোকে সংজ্ঞায়িত করে।
Unidirectional এবং Bidirectional Relationship এর মধ্যে পার্থক্য
| Concept | Unidirectional Relationship | Bidirectional Relationship |
|---|---|---|
| Relationship Type | এক Entity অন্য Entity এর দিকে সম্পর্ক স্থাপন করে, কিন্তু বিপরীত দিকে কোনো সম্পর্ক নেই। | দুটি Entity একে অপরের দিকে সম্পর্ক স্থাপন করতে পারে। |
| Data Mapping | এক Entity সম্পর্কিত Entity গুলোর তথ্য জানে, কিন্তু বিপরীত দিকে কোনো তথ্য নেই। | দুটি Entity একে অপরের সম্পর্কিত তথ্য জানে। |
| Example | One-to-Many (Department -> Employees) | One-to-Many (Department <- Employees) |
| Performance | কিছুটা দ্রুত কারণ একটি Entity শুধুমাত্র এক Entity এর দিকে ইঙ্গিত করে। | অতিরিক্ত সম্পর্ক এবং ডেটা ম্যানিপুলেশনের কারণে একটু ধীর হতে পারে। |
সারাংশ
JPA এ Unidirectional এবং Bidirectional সম্পর্ক দুটি Entity ক্লাসের মধ্যে সম্পর্ক স্থাপন করতে ব্যবহৃত হয়। Unidirectional Relationship হল একটি সম্পর্ক যেখানে একটি Entity অন্য Entity এর সাথে সম্পর্ক স্থাপন করে, কিন্তু বিপরীত দিকে কোনো সম্পর্ক নেই। অপরদিকে, Bidirectional Relationship হল একটি সম্পর্ক যেখানে দুটি Entity একে অপরের সাথে সম্পর্ক স্থাপন করতে পারে এবং ডেটাবেসে সম্পর্কিত টেবিলগুলির মধ্যে যোগাযোগ তৈরি করে। JPA এর মাধ্যমে আমরা One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্ক স্থাপন করতে পারি, এবং এই সম্পর্কের মধ্যে Unidirectional বা Bidirectional সেটআপ করা যায়।
Read more