JPA (Java Persistence API) তে Inheritance Mapping হল একটি কৌশল যার মাধ্যমে Object-Oriented Inheritance এর ধারণা রিলেশনাল ডেটাবেসে বাস্তবায়িত করা হয়। অর্থাৎ, যখন Java ক্লাসে Inheritance ব্যবহৃত হয়, তখন এটি ডেটাবেস টেবিলের মধ্যে কিভাবে ম্যাপ করা হবে তা JPA নির্ধারণ করে।
Inheritance হল OOP (Object-Oriented Programming) এর একটি মৌলিক ধারণা, যেখানে একটি ক্লাস অন্য একটি ক্লাস থেকে বৈশিষ্ট্য (properties) এবং আচরণ (behaviors) উত্তরাধিকার সূত্রে পায়। JPA তে, ইনহেরিট্যান্স মডেল কনফিগার করার জন্য তিনটি প্রধান পদ্ধতি রয়েছে:
- Single Table Inheritance (একটি টেবিল ব্যবহার করা)
- Joined Table Inheritance (একাধিক টেবিল ব্যবহার করা)
- Table Per Class Inheritance (প্রতিটি ক্লাসের জন্য আলাদা টেবিল)
এই তিনটি পদ্ধতির মাধ্যমে JPA ইনহেরিট্যান্স সম্পর্কিত ক্লাসের মধ্যে ডেটাবেস টেবিলের ম্যাপিং কিভাবে হবে তা নির্ধারণ করা হয়।
Single Table Inheritance (একটি টেবিল ব্যবহার করা)
Single Table Inheritance পদ্ধতিতে সমস্ত ইনহেরিটেড ক্লাসগুলোকে একটি একক টেবিলে ম্যাপ করা হয়। এই পদ্ধতিতে একটি টেবিল থাকে যা সমস্ত সাবক্লাসের ডেটা ধারণ করে, এবং একটি অতিরিক্ত কলাম (যেমন discriminator column) ব্যবহার করা হয় যাতে বোঝা যায় কোন রেকর্ড কোন সাবক্লাসের।
Single Table Inheritance এর উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING)
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String model;
// Getter এবং Setter
}
@Entity
@DiscriminatorValue("Car")
public class Car extends Vehicle {
private int doors;
// Getter এবং Setter
}
@Entity
@DiscriminatorValue("Bike")
public class Bike extends Vehicle {
private boolean hasPedals;
// Getter এবং Setter
}
এখানে:
- @Inheritance(strategy = InheritanceType.SINGLE_TABLE) অ্যানোটেশনটি Vehicle ক্লাসকে একটি সিঙ্গেল টেবিলের জন্য ব্যবহার করছে।
- @DiscriminatorColumn এবং @DiscriminatorValue ব্যবহার করে টেবিলের মধ্যে ভিন্ন ভিন্ন সাবক্লাসগুলোকে চিহ্নিত করা হয়।
Database Table Structure:
| id | model | vehicle_type | doors | hasPedals |
|---|---|---|---|---|
| 1 | CarModel1 | Car | 4 | NULL |
| 2 | BikeModel1 | Bike | NULL | true |
- vehicle_type কলামটি ডিসক্রিমিনেটর কলাম হিসেবে কাজ করে, যা
CarএবংBikeএর মধ্যে পার্থক্য নির্ধারণ করে।
Joined Table Inheritance (একাধিক টেবিল ব্যবহার করা)
Joined Table Inheritance পদ্ধতিতে, প্রতিটি ক্লাসের জন্য একটি আলাদা টেবিল তৈরি করা হয়। একটি টেবিল সপোর্ট করে মূল (পারেন্ট) ক্লাসের প্রপার্টি, এবং অন্য টেবিলগুলো সাবক্লাসের জন্য নির্দিষ্ট ডেটা ধারণ করে। টেবিলগুলোর মধ্যে একটি JOIN সম্পর্ক স্থাপন করা হয়।
Joined Table Inheritance এর উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String model;
// Getter এবং Setter
}
@Entity
public class Car extends Vehicle {
private int doors;
// Getter এবং Setter
}
@Entity
public class Bike extends Vehicle {
private boolean hasPedals;
// Getter এবং Setter
}
Database Tables:
- Vehicle Table:
| id | model |
|---|---|
| 1 | CarModel1 |
| 2 | BikeModel1 |
- Car Table:
| id | doors |
|---|---|
| 1 | 4 |
- Bike Table:
| id | hasPedals |
|---|---|
| 2 | true |
এখানে:
- Vehicle টেবিলটি Car এবং Bike টেবিলের সাথে JOIN সম্পর্ক স্থাপন করে, যাতে উপরের সব ডেটা একসাথে পাওয়া যায়।
Table Per Class Inheritance (প্রতিটি ক্লাসের জন্য আলাদা টেবিল)
Table Per Class Inheritance পদ্ধতিতে, প্রতিটি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি করা হয়, এবং সেই টেবিলে পুরো ক্লাসের ডেটা থাকে, তবে তারপরে JOIN করা হয় না। এটি সহজ তবে কিছু ক্ষেত্রে ডেটার পুনরাবৃত্তি হতে পারে।
Table Per Class Inheritance এর উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String model;
// Getter এবং Setter
}
@Entity
public class Car extends Vehicle {
private int doors;
// Getter এবং Setter
}
@Entity
public class Bike extends Vehicle {
private boolean hasPedals;
// Getter এবং Setter
}
Database Tables:
- Vehicle Table:
| id | model |
|---|---|
| 1 | CarModel1 |
| 2 | BikeModel1 |
- Car Table:
| id | model | doors |
|---|---|---|
| 1 | CarModel1 | 4 |
- Bike Table:
| id | model | hasPedals |
|---|---|---|
| 2 | BikeModel1 | true |
এখানে:
- Vehicle, Car, এবং Bike টেবিলগুলো আলাদা আলাদা ডেটা ধারণ করে, এবং প্রত্যেকটি টেবিল সম্পূর্ণ ক্লাসের ডেটা সংরক্ষণ করে।
JPA Inheritance Strategy Summary
| Strategy | Description | Example |
|---|---|---|
| Single Table | সমস্ত ইনহেরিটেড ক্লাস একটি টেবিলের মধ্যে স্টোর করা হয়। | সহজ, তবে বড় ক্লাসের জন্য ডেটা পুনরাবৃত্তি হতে পারে। |
| Joined Table | প্রতিটি ক্লাসের জন্য আলাদা টেবিল, ডেটা JOIN করা হয়। | ডেটার পুনরাবৃত্তি কম, তবে জটিলতা বেশি। |
| Table Per Class | প্রতিটি ক্লাসের জন্য আলাদা টেবিল, কিন্তু JOIN করা হয় না। | সহজ, তবে বড় ক্লাসের জন্য ডেটা পুনরাবৃত্তি হতে পারে। |
সার্বিক পর্যালোচনা
JPA Inheritance Mapping একটি গুরুত্বপূর্ণ ধারণা যা Java অবজেক্ট এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। JPA তে ইনহেরিট্যান্স মডেল কনফিগার করার জন্য Single Table, Joined Table, এবং Table Per Class এর তিনটি পদ্ধতি রয়েছে। প্রতিটি পদ্ধতির সুবিধা এবং অসুবিধা রয়েছে, এবং ডেভেলপারদের এটি তাদের প্রোজেক্টের চাহিদা অনুযায়ী নির্বাচন করতে হবে।
Single Table Inheritance সিম্পল কিন্তু কিছু ক্ষেত্রে ডেটা পুনরাবৃত্তি হতে পারে, Joined Table Inheritance রিলেশনাল ডেটাবেসের জন্য আরও উপযোগী, এবং Table Per Class Inheritance সহজ হলেও কিছু ক্ষেত্রে ডেটা পুনরাবৃত্তি হতে পারে।
Read more