Hibernate-এ Table per Class Strategy একটি ইনহেরিটেন্স স্ট্রাটেজি যা Single Table Inheritance থেকে ভিন্ন। এই স্ট্রাটেজিতে, প্রতিটি ক্লাস (বিশেষত সুপার ক্লাস এবং সাব ক্লাস) আলাদা আলাদা টেবিল হিসেবে ডাটাবেসে সংরক্ষিত হয়। এটি "Concrete Table Inheritance" নামেও পরিচিত, কারণ সব ক্লাসের জন্য আলাদা টেবিল তৈরি করা হয় এবং তাদের মধ্যে সম্পর্ক সাধারণত Join এর মাধ্যমে স্থাপন করা হয় না।
Table per Class Strategy-এর মূল ধারণা:
- Superclass এবং Subclass এর জন্য আলাদা টেবিল তৈরি করা হয়।
- প্রতিটি টেবিলেই কেবল তার নিজস্ব প্রপার্টি থাকে, এবং যদি সাবক্লাসে অতিরিক্ত প্রপার্টি থাকে, সেগুলি শুধুমাত্র সেই ক্লাসের টেবিলে থাকে।
- ডাটা ডুপ্লিকেশন: সবার জন্য আলাদা টেবিল থাকায় কিছু ডাটা ডুপ্লিকেশন হতে পারে, যেমন, একই তথ্য বারবার প্রতিটি টেবিলে থাকতে পারে।
Table per Class Strategy এর সুবিধা ও অসুবিধা
সুবিধা:
- Performance: বড় ডাটাবেসে যেখানে সম্পর্ক কম গুরুত্বপূর্ণ, সেখানে এই স্ট্রাটেজি কার্যকর হতে পারে।
- Simplified Model: এখানে জটিল
JOINঅপারেশনের প্রয়োজন হয় না, কারণ প্রতিটি ক্লাসের জন্য আলাদা টেবিল থাকে।
অসুবিধা:
- ডাটা ডুপ্লিকেশন: সুপার ক্লাসের সকল কলাম প্রতিটি সাব ক্লাসে পুনরাবৃত্তি হয়, যা ডাটাবেসে ডুপ্লিকেশন সৃষ্টি করে।
- এডমিনিস্ট্রেশন: বিভিন্ন টেবিলের ব্যবস্থাপনা আরও কঠিন হতে পারে এবং কোডিং এবং মেইনটেন্যান্স জটিল হতে পারে।
Example of Table per Class Strategy in Hibernate
ধরা যাক, আমাদের একটি Employee সুপার ক্লাস রয়েছে এবং এটি দুটি সাব ক্লাস FullTimeEmployee এবং PartTimeEmployee তে ইনহেরিট করা হয়।
Step 1: Define the Superclass and Subclasses
- Superclass:
Employee
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private int id;
private String name;
// Getters and Setters
}
- Subclass:
FullTimeEmployee
import javax.persistence.Entity;
@Entity
public class FullTimeEmployee extends Employee {
private double salary;
// Getters and Setters
}
- Subclass:
PartTimeEmployee
import javax.persistence.Entity;
@Entity
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Getters and Setters
}
Step 2: Configure hibernate.cfg.xml for Table per Class Strategy
Hibernate এর কনফিগারেশন ফাইলে আপনি @Inheritance অ্যানোটেশন ব্যবহার করে স্ট্রাটেজি সিলেক্ট করতে পারবেন। আমরা @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) ব্যবহার করব।
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Employee {
@Id
private int id;
private String name;
// Getters and Setters
}
এখানে, @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) নির্দেশনা দিয়ে Hibernate জানায় যে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি করতে হবে।
Step 3: Hibernate Mapping (Database Tables)
এখন Hibernate এই Employee, FullTimeEmployee, এবং PartTimeEmployee ক্লাসের জন্য আলাদা টেবিল তৈরি করবে। টেবিলগুলির সিএলএল দেখতে কিছুটা এইরকম হবে:
- Employee Table:
CREATE TABLE Employee (
id INT PRIMARY KEY,
name VARCHAR(255)
);
- FullTimeEmployee Table:
CREATE TABLE FullTimeEmployee (
id INT PRIMARY KEY,
name VARCHAR(255),
salary DOUBLE
);
- PartTimeEmployee Table:
CREATE TABLE PartTimeEmployee (
id INT PRIMARY KEY,
name VARCHAR(255),
hourlyRate DOUBLE
);
Step 4: Saving Data using Table per Class Strategy
এখন আপনি এই টেবিলগুলো ব্যবহার করে ডেটা ইনসার্ট করতে পারেন, যেখানে প্রতিটি ক্লাসের জন্য আলাদা টেবিল থাকবে।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class EmployeeTest {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(FullTimeEmployee.class)
.addAnnotatedClass(PartTimeEmployee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
// Create Employee objects
FullTimeEmployee fullTimeEmployee = new FullTimeEmployee();
fullTimeEmployee.setName("John Doe");
fullTimeEmployee.setSalary(50000);
PartTimeEmployee partTimeEmployee = new PartTimeEmployee();
partTimeEmployee.setName("Jane Smith");
partTimeEmployee.setHourlyRate(20);
// Start a transaction
session.beginTransaction();
// Save the employees
session.save(fullTimeEmployee);
session.save(partTimeEmployee);
// Commit transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Step 5: Querying the Data
এখন যখন আপনি ডেটা রিট্রিভ করবেন, Hibernate বিভিন্ন টেবিল থেকে ডেটা একত্রিত করবে এবং সেগুলিকে অবজেক্টে ম্যাপ করবে। উদাহরণস্বরূপ:
public class EmployeeTest {
public static void main(String[] args) {
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(FullTimeEmployee.class)
.addAnnotatedClass(PartTimeEmployee.class)
.buildSessionFactory();
Session session = factory.getCurrentSession();
try {
session.beginTransaction();
// Retrieving FullTimeEmployee and PartTimeEmployee
List<FullTimeEmployee> fullTimeEmployees = session.createQuery("from FullTimeEmployee").getResultList();
List<PartTimeEmployee> partTimeEmployees = session.createQuery("from PartTimeEmployee").getResultList();
// Display the results
for (FullTimeEmployee employee : fullTimeEmployees) {
System.out.println("FullTimeEmployee: " + employee.getName() + ", Salary: " + employee.getSalary());
}
for (PartTimeEmployee employee : partTimeEmployees) {
System.out.println("PartTimeEmployee: " + employee.getName() + ", Hourly Rate: " + employee.getHourlyRate());
}
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
Table per Class Strategy Hibernate-এ একটি ইনহেরিটেন্স স্ট্রাটেজি যা প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি করে। এটি ডাটাবেসে Inheritance সম্পর্কিত তথ্য ম্যানেজ করতে সহায়ক। যদিও এটি কিছু ডুপ্লিকেশন তৈরি করতে পারে এবং পারফরম্যান্সে কিছু প্রভাব ফেলতে পারে, তবে যখন ডেটাবেসের সম্পর্কগুলি আলাদা টেবিলের মধ্যে রাখতে হয় এবং জটিল JOIN অপারেশন এড়িয়ে চলা দরকার, তখন এটি উপযুক্ত হয়।
এই স্ট্রাটেজির সাহায্যে আপনি ডেটা অরগানাইজ করতে পারবেন যেখানে প্রতিটি সাব ক্লাসের জন্য আলাদা টেবিল থাকবে এবং আপনাকে বিভিন্ন JOIN অপারেশন করার প্রয়োজন হবে না।