Hibernate-এ Joined Table Strategy হল Inheritance Mapping এর একটি পদ্ধতি যা আপনি ব্যবহার করতে পারেন যখন আপনার জাভা ক্লাসগুলি একে অপরের সাথে সম্পর্কিত হয় এবং আপনি চান যে ডাটাবেসে পৃথক টেবিলগুলিতে এই সম্পর্কগুলিকে সংরক্ষণ করা হোক। এটি Single Table Strategy এবং Table per Subclass থেকে আলাদা, কারণ এটি ইনহেরিটেড ক্লাসের জন্য পৃথক টেবিল তৈরি করে এবং তাদের মধ্যে একটি join তৈরি করে।
Joined Table Strategy:
Hibernate-এ Joined Table Strategy হল একটি পদ্ধতি যেখানে superclass এবং subclass ক্লাসগুলির জন্য আলাদা আলাদা টেবিল তৈরি করা হয় এবং তারপরে একটি JOIN ব্যবহার করে তাদের মধ্যে সম্পর্ক স্থাপন করা হয়। এর মাধ্যমে, আপনি আপনার ইনহেরিটেন্স হায়ারার্কি (superclass ও subclass) ডাটাবেসে পৃথক টেবিল হিসেবে সংরক্ষণ করতে পারেন।
Conceptual Overview:
- Superclass এর জন্য একটি টেবিল থাকবে।
- Subclass এর জন্য আলাদা একটি টেবিল থাকবে।
- সবগুলো টেবিলের মধ্যে JOIN হবে
@PrimaryKeyJoinColumnব্যবহার করে। @Inheritance(strategy = InheritanceType.JOINED)ব্যবহার করলে Hibernate জানবে যে এটি Joined Table Strategy।
Use Case:
যদি আপনার এমন একটি পরিস্থিতি থাকে যেখানে আপনি Inheritance ব্যবহার করছেন এবং আপনার ক্লাসের বিভিন্ন সাবক্লাসগুলির জন্য আলাদা টেবিল প্রয়োজন, তবে Joined Table Strategy কার্যকর হতে পারে। এতে প্রতিটি সাবক্লাসের জন্য পৃথক টেবিল থাকবে এবং সেই টেবিলগুলি মূল টেবিলের সাথে join করা হবে। এটি ডেটা সঞ্চয় করার জন্য আরও নর্মালাইজড একটি কাঠামো সরবরাহ করে।
Example: Joined Table Strategy in Hibernate
Step 1: Create the Entity Classes
এখানে, আমরা একটি Employee ক্লাস এবং তার সাবক্লাস FullTimeEmployee এবং PartTimeEmployee তৈরি করব।
Superclass (Employee)
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED) // Specify JOINED inheritance strategy
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
public Employee() {}
public Employee(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;
}
}
এখানে, Employee ক্লাসটি সুপারক্লাস হিসেবে কাজ করছে এবং @Inheritance(strategy = InheritanceType.JOINED) অ্যানোটেশনটি ব্যবহার করা হয়েছে যাতে Hibernate জানে যে এটি Joined Table Strategy ব্যবহার করবে।
Subclass (FullTimeEmployee)
import javax.persistence.*;
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
public FullTimeEmployee() {}
public FullTimeEmployee(String name, double salary) {
super(name);
this.salary = salary;
}
// Getters and setters
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
এখানে, FullTimeEmployee ক্লাসটি Employee ক্লাস থেকে ইনহেরিট করেছে এবং এর নিজস্ব salary ফিল্ড রয়েছে।
Subclass (PartTimeEmployee)
import javax.persistence.*;
@Entity
public class PartTimeEmployee extends Employee {
private int hoursWorked;
public PartTimeEmployee() {}
public PartTimeEmployee(String name, int hoursWorked) {
super(name);
this.hoursWorked = hoursWorked;
}
// Getters and setters
public int getHoursWorked() {
return hoursWorked;
}
public void setHoursWorked(int hoursWorked) {
this.hoursWorked = hoursWorked;
}
}
এখানে, PartTimeEmployee ক্লাসটি Employee থেকে ইনহেরিট করেছে এবং এর নিজস্ব hoursWorked ফিল্ড রয়েছে।
Step 2: Hibernate Configuration
Hibernate কনফিগারেশন ফাইল hibernate.cfg.xml তৈরি করুন যাতে ডাটাবেস সংযোগের সমস্ত প্রপার্টি এবং টেবিল সম্পর্কিত কনফিগারেশন থাকে।
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- JDBC Database connection settings -->
<property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password"></property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Show SQL -->
<property name="hibernate.show_sql">true</property>
<!-- Drop and re-create the database schema on startup -->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- Mention the annotated class -->
<mapping class="com.example.hibernate.Employee"/>
<mapping class="com.example.hibernate.FullTimeEmployee"/>
<mapping class="com.example.hibernate.PartTimeEmployee"/>
</session-factory>
</hibernate-configuration>
এখানে, hibernate.cfg.xml ফাইলে ডাটাবেস সংযোগ এবং Hibernate কনফিগারেশন সম্পর্কিত সমস্ত তথ্য দেওয়া হয়েছে।
Step 3: Using Hibernate to Save Data
এখন, আমরা Session এবং Transaction ব্যবহার করে ডেটা সেভ করব। যখন আপনি Joined Table Strategy ব্যবহার করেন, Hibernate দুটি টেবিল তৈরি করবে — একটি Employee টেবিল এবং অন্যটি FullTimeEmployee বা PartTimeEmployee টেবিল।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
public class MainApp {
public static void main(String[] args) {
// Hibernate configuration and session factory setup
SessionFactory sessionFactory = new org.hibernate.cfg.Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.addAnnotatedClass(FullTimeEmployee.class)
.addAnnotatedClass(PartTimeEmployee.class)
.buildSessionFactory();
// Creating session
Session session = sessionFactory.getCurrentSession();
try {
// Start a transaction
Transaction transaction = session.beginTransaction();
// Create FullTimeEmployee instance
FullTimeEmployee fullTimeEmployee = new FullTimeEmployee("John", 50000);
// Save the object
session.save(fullTimeEmployee);
// Commit the transaction
transaction.commit();
System.out.println("Employee saved successfully!");
} finally {
sessionFactory.close();
}
}
}
এখানে, FullTimeEmployee অবজেক্ট তৈরি করে সেভ করা হচ্ছে। Hibernate Employee টেবিলের জন্য একটি রেকর্ড তৈরি করবে এবং FullTimeEmployee টেবিলের জন্য আলাদা একটি রেকর্ড তৈরি করবে, যেটি Employee টেবিলের সঙ্গে JOIN হয়ে থাকবে।
Step 4: Database Schema
Hibernate Joined Table Strategy ব্যবহার করলে ডাটাবেসে দুটি টেবিল তৈরি হবে:
Employee টেবিল (Superclass):
CREATE TABLE Employee ( id INT PRIMARY KEY, name VARCHAR(255) );FullTimeEmployee টেবিল (Subclass):
CREATE TABLE FullTimeEmployee ( id INT PRIMARY KEY, salary DOUBLE, FOREIGN KEY (id) REFERENCES Employee(id) );
Advantages of Using the Joined Table Strategy:
- Normalized Database Schema: ডাটাবেসের টেবিলগুলি ভালভাবে নর্মালাইজড থাকে, যার ফলে ডেটা পুনরাবৃত্তি কম হয়।
- Efficient Storage: শুধুমাত্র subclass-specific ডেটা তার নিজস্ব টেবিলে সংরক্ষণ করা হয়, এবং superclass-এর সাধারণ ডেটা একটি আলাদা টেবিলে রাখা হয়।
- Clear Data Separation: আলাদা টেবিলগুলি মেনটেন করে, ক্লাসগুলির মধ্যে সম্পর্ক স্পষ্টভাবে পরিস্কার থাকে।
Disadvantages of Using the Joined Table Strategy:
- Join Complexity: একাধিক টেবিলের মধ্যে JOIN করার ফলে কিছুটা জটিলতা এবং পারফরম্যান্স সমস্যা হতে পারে, বিশেষ করে বড় ডেটাসেটে।
- Increased Query Complexity: আপনাকে বারবার
JOINকরতে হতে পারে, যা কিছু পরিমাণে কোড এবং কুয়েরি জটিল করতে পারে।
Hibernate-এর Joined Table Strategy ব্যবহার করে আপনি Inheritance Mapping এবং Normalization করতে পারেন, যেখানে আপনার superclass এবং subclass এর জন্য পৃথক টেবিল তৈরি হয় এবং তাদের মধ্যে সম্পর্ক JOIN এর মাধ্যমে স্থাপন করা হয়। এই পদ্ধতি ডেটাবেসের টেবিলগুলিকে আরও মডুলার এবং পরিষ্কারভাবে তৈরি করতে সাহায্য করে, তবে কিছু ক্ষেত্রে JOIN এর কারণে পারফরম্যান্স সমস্যাও হতে পারে।