Inheritance Mapping হল Hibernate বা JPA-তে Entity ক্লাসের মধ্যে ইনহেরিটেন্স (Inheritance) সম্পর্ক পরিচালনা করার একটি পদ্ধতি। এটি ডাটাবেসে অবজেক্ট ওরিয়েন্টেড ইনহেরিটেন্স মডেল কিভাবে বাস্তবায়ন করা হবে তা সংজ্ঞায়িত করে। Hibernate বা JPA ইনহেরিটেন্স ব্যবহারের জন্য তিনটি প্রধান স্ট্র্যাটেজি প্রদান করে:
- Single Table (একক টেবিল)
- Table Per Class (প্রতিটি ক্লাসের জন্য আলাদা টেবিল)
- Joined Table (যোগ করা টেবিল)
নিচে প্রতিটি স্ট্র্যাটেজি উদাহরণসহ ব্যাখ্যা করা হলো।
১. Single Table স্ট্র্যাটেজি
Single Table স্ট্র্যাটেজি-তে সকল সাবক্লাসের ডেটা একটি মাত্র টেবিলে সংরক্ষিত হয়। এটি সর্বোচ্চ পারফরম্যান্স প্রদান করে কারণ কোয়্যারিতে একাধিক টেবিলের যোগ প্রয়োজন হয় না।
উদাহরণ:
Entity ক্লাস
import jakarta.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
@DiscriminatorValue("FullTime")
public class FullTimeEmployee extends Employee {
private Double salary;
// Getters and Setters
}
@Entity
@DiscriminatorValue("PartTime")
public class PartTimeEmployee extends Employee {
private Double hourlyRate;
// Getters and Setters
}
টেবিল গঠন
Hibernate employees নামে একটি টেবিল তৈরি করবে যেখানে type কলাম FullTime বা PartTime নির্দেশ করবে।
২. Table Per Class স্ট্র্যাটেজি
Table Per Class স্ট্র্যাটেজি-তে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়। এটি ব্যবহার করলে প্রতিটি টেবিল আলাদাভাবে প্রশ্ন করা সম্ভব, তবে কোয়্যারি করতে হলে যোগ প্রয়োজন হতে পারে।
উদাহরণ:
Entity ক্লাস
import jakarta.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class FullTimeEmployee extends Employee {
private Double salary;
// Getters and Setters
}
@Entity
public class PartTimeEmployee extends Employee {
private Double hourlyRate;
// Getters and Setters
}
টেবিল গঠন
Hibernate full_time_employee এবং part_time_employee নামে দুটি আলাদা টেবিল তৈরি করবে। প্রতিটি টেবিলে ইনহেরিট করা ফিল্ডগুলো সংরক্ষণ থাকবে।
৩. Joined Table স্ট্র্যাটেজি
Joined Table স্ট্র্যাটেজি-তে প্যারেন্ট ক্লাস এবং সাবক্লাসের জন্য আলাদা টেবিল তৈরি হয়। এটি ডাটার স্বাভাবিকীকরণ নিশ্চিত করে এবং মেমোরি ব্যবহার দক্ষ করে তোলে।
উদাহরণ:
Entity ক্লাস
import jakarta.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class FullTimeEmployee extends Employee {
private Double salary;
// Getters and Setters
}
@Entity
public class PartTimeEmployee extends Employee {
private Double hourlyRate;
// Getters and Setters
}
টেবিল গঠন
Hibernate নিম্নলিখিত টেবিল তৈরি করবে:
employeeটেবিল (শুধুমাত্রidএবংnameফিল্ড ধারণ করবে)।full_time_employeeটেবিল (salaryধারণ করবে)।part_time_employeeটেবিল (hourlyRateধারণ করবে)।
Spring Configuration
Hibernate Configuration বা Spring Bean Configuration ব্যবহার করে SessionFactory তৈরি করতে হবে। উদাহরণ:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/inheritance_demo");
dataSource.setUsername("root");
dataSource.setPassword("password");
return dataSource;
}
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(dataSource());
sessionFactory.setPackagesToScan("com.example.model");
return sessionFactory;
}
}
CRUD অপারেশন বাস্তবায়ন
@Service
@Transactional
public class EmployeeService {
@Autowired
private SessionFactory sessionFactory;
public void saveEmployee(Employee employee) {
Session session = sessionFactory.getCurrentSession();
session.save(employee);
}
public Employee getEmployeeById(Long id) {
Session session = sessionFactory.getCurrentSession();
return session.get(Employee.class, id);
}
}
Main ক্লাস
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext context =
new AnnotationConfigApplicationContext(AppConfig.class);
EmployeeService employeeService = context.getBean(EmployeeService.class);
// Save FullTimeEmployee
FullTimeEmployee fullTimeEmployee = new FullTimeEmployee();
fullTimeEmployee.setName("John Doe");
fullTimeEmployee.setSalary(80000.0);
employeeService.saveEmployee(fullTimeEmployee);
// Save PartTimeEmployee
PartTimeEmployee partTimeEmployee = new PartTimeEmployee();
partTimeEmployee.setName("Jane Doe");
partTimeEmployee.setHourlyRate(40.0);
employeeService.saveEmployee(partTimeEmployee);
// Fetch Employee
Employee employee = employeeService.getEmployeeById(fullTimeEmployee.getId());
System.out.println("Fetched Employee: " + employee.getName());
context.close();
}
}
সারাংশ
Spring ORM-এর Inheritance Mapping বিভিন্ন স্ট্র্যাটেজি (Single Table, Table Per Class, এবং Joined Table) ব্যবহার করে Entity ইনহেরিটেন্স পরিচালনা করে। স্ট্র্যাটেজি নির্বাচন অ্যাপ্লিকেশনের পারফরম্যান্স এবং ডাটাবেস নকশার উপর নির্ভর করে। Inheritance Mapping ব্যবহার করে Object-Oriented মডেল এবং ডাটাবেসের মধ্যে সামঞ্জস্য বজায় রাখা সম্ভব।
Read more