Many-to-Many (M:N) সম্পর্ক হল এমন একটি সম্পর্ক যেখানে একটি এন্টিটি (Entity) একাধিক অন্য এন্টিটির সাথে সম্পর্কিত থাকে, এবং অপর এন্টিটি একইভাবে প্রথম এন্টিটির একাধিক ইনস্ট্যান্সের সাথে সম্পর্কিত থাকে। Hibernate-এ Many-to-Many সম্পর্ক ম্যাপিং করার জন্য, সাধারণত একটি join table ব্যবহৃত হয় যা দুটি টেবিলের মধ্যে সম্পর্ক স্থাপন করে।
Hibernate Many-to-Many সম্পর্ক বাস্তবায়ন করতে @ManyToMany অ্যানোটেশন ব্যবহার করা হয়। এছাড়া @JoinTable অ্যানোটেশন ব্যবহার করা হয়, যা join table এর কনফিগারেশন সম্পাদন করে।
Many-to-Many সম্পর্কের উদাহরণ
ধরা যাক, আমাদের একটি Student এবং একটি Course Entity Class আছে। এক ছাত্র (Student) একাধিক কোর্সে (Course) ভর্তি হতে পারে এবং এক কোর্সে একাধিক ছাত্র (Student) থাকতে পারে। এটি একটি Many-to-Many সম্পর্ক।
ধাপ 1: Entity ক্লাস তৈরি করা
Student Entity Class:
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "student")
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private Set<Course> courses = new HashSet<>();
public Student() {}
public Student(String name) {
this.name = name;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Course> getCourses() {
return courses;
}
public void setCourses(Set<Course> courses) {
this.courses = courses;
}
// Add helper method to add course
public void addCourse(Course course) {
courses.add(course);
course.getStudents().add(this);
}
}
Course Entity Class:
import javax.persistence.*;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "course")
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String title;
@ManyToMany(mappedBy = "courses")
private Set<Student> students = new HashSet<>();
public Course() {}
public Course(String title) {
this.title = title;
}
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
}
}
ধাপ 2: Hibernate Configuration ফাইল তৈরি করা
Hibernate কনফিগারেশন ফাইল (hibernate.cfg.xml) তৈরি করুন, যা ডেটাবেস সংযোগ এবং অন্যান্য সেটিংস কনফিগার করবে।
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<property name="hibernate.show_sql">true</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.example.model.Student"/>
<mapping class="com.example.model.Course"/>
</session-factory>
</hibernate-configuration>
ধাপ 3: Many-to-Many সম্পর্কের সাথে ডেটাবেসে ডেটা সন্নিবেশ করা (Insert Data)
এখন, Hibernate ব্যবহার করে আমরা Student এবং Course ডেটা সন্নিবেশ করতে পারি এবং Many-to-Many সম্পর্ক স্থাপন করতে পারি।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateApp {
public static void main(String[] args) {
// Create SessionFactory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Student.class).addAnnotatedClass(Course.class).buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Create new Student object
Student student1 = new Student("John");
Student student2 = new Student("Alice");
// Create new Course objects
Course course1 = new Course("Math");
Course course2 = new Course("Science");
// Establish the relationship (add courses to students and students to courses)
student1.addCourse(course1);
student1.addCourse(course2);
student2.addCourse(course1);
// Start a transaction
session.beginTransaction();
// Save the students and courses
session.save(student1);
session.save(student2);
session.save(course1);
session.save(course2);
// Commit transaction
session.getTransaction().commit();
System.out.println("Saved students and courses successfully!");
} finally {
factory.close();
}
}
}
Explanation:
@ManyToMany: এটিStudentএবংCourseক্লাসের মধ্যে Many-to-Many সম্পর্ক প্রতিষ্ঠা করে।@JoinTable: এটি একটি join table তৈরি করতে সাহায্য করে যা student_course নামে হবে এবং এটি দুটি টেবিলের মধ্যে সম্পর্ক স্থাপন করবে।joinColumns: এটি student_id কে student টেবিলের id ফিল্ডে ম্যাপ করবে।inverseJoinColumns: এটি course_id কে course টেবিলের id ফিল্ডে ম্যাপ করবে।
mappedBy: এটিCourseক্লাসের মধ্যেStudentক্লাসের Many-to-Many সম্পর্কের inverse side নির্দেশ করে, যার মানে হল যেCourseটেবিলের মধ্যে ডেটা সম্পর্কিত থাকলেও,Studentক্লাসেরcoursesপ্রপার্টি সংযুক্ত থাকে।
ধাপ 4: Many-to-Many সম্পর্ক থেকে ডেটা রিট্রিভ করা (Retrieve Data)
এখন, ডেটা রিট্রিভ করতে HQL (Hibernate Query Language) ব্যবহার করা যেতে পারে। নিচে একটি উদাহরণ দেওয়া হলো:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.query.Query;
import java.util.List;
public class HibernateApp {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Student.class).addAnnotatedClass(Course.class).buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Create an HQL query to get all students and their courses
Query<Student> query = session.createQuery("from Student s join fetch s.courses", Student.class);
List<Student> students = query.getResultList();
// Display the students and their courses
for (Student student : students) {
System.out.println("Student: " + student.getName());
for (Course course : student.getCourses()) {
System.out.println(" - " + course.getTitle());
}
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Explanation:
- HQL query:
from Student s join fetch s.coursesএই কোয়েরিStudentএবং তার courses সম্পর্কিত ডেটা সংগ্রহ করবে। join fetch: এটি fetch join ব্যবহার করে courses এর ডেটা student এর সাথে একত্রে আনে।
- Hibernate এ Many-to-Many relationship তৈরি করার জন্য
@ManyToManyঅ্যানোটেশন এবং@JoinTableব্যবহার করা হয়, যা টেবিলগুলির মধ্যে সম্পর্ক তৈরি এবং পরিচালনা করে। - Hibernate Entity Class, join table এবং HQL ব্যবহার করে আপনি Many-to-Many সম্পর্ক তৈরি করতে, ডেটা সন্নিবেশ করতে এবং রিট্রিভ করতে পারেন।
- Hibernate object-relational mapping (ORM) এর মাধ্যমে সম্পর্কিত ডেটাবেসের সঙ্গে সহজভাবে কাজ করতে সাহায্য করে।