JPA (Java Persistence API) তে Inheritance একটি মৌলিক ধারণা, যেখানে একটি শ্রেণী (class) অন্য শ্রেণী (class) থেকে বৈশিষ্ট্য এবং আচরণ (properties and behaviors) উত্তরাধিকারী হয়। জেভিএইচ (JPA) এ ইনহেরিটেন্স সম্পর্কিত তিনটি মূল কৌশল বা স্ট্রাটেজি রয়েছে:
- Joined Strategy
- Table-per-Class Strategy
- Single Table Strategy
এই তিনটি স্ট্র্যাটেজি জাভা অবজেক্টের ইনহেরিটেন্স মডেল ডেটাবেসে ম্যাপ করার জন্য ব্যবহৃত হয়।
এই উদাহরণে, আমরা Inheritance in JPA এর জন্য Joined Strategy এবং Table-per-Class Strategy এর মাধ্যমে একটি বাস্তব প্রয়োগ (Practical Example) দেখবো।
1. Joined Strategy
Joined Strategy তে প্রতি সাবক্লাসের জন্য আলাদা টেবিল তৈরি করা হয় এবং সব টেবিলের মধ্যে একটি সম্পর্ক (JOIN) প্রতিষ্ঠিত থাকে। এই স্ট্র্যাটেজি ডেটাবেসে normalized কাঠামো তৈরি করে, যেখানে মূল ক্লাসের টেবিল এবং সাবক্লাসের টেবিল পৃথকভাবে থাকে, কিন্তু তাদের মধ্যে সম্পর্ক থাকে।
Joined Strategy উদাহরণ:
ধরা যাক, আমাদের একটি Person ক্লাস আছে এবং এর দুটি সাবক্লাস Employee এবং Customer আছে।
Step 1: Entity Classes
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getter and Setter methods
}
@Entity
public class Employee extends Person {
private String department;
// Getter and Setter methods
}
@Entity
public class Customer extends Person {
private String membershipLevel;
// Getter and Setter methods
}
এখানে, @Inheritance(strategy = InheritanceType.JOINED) অ্যানোটেশন ব্যবহার করা হয়েছে, যা Joined Strategy এর মাধ্যমে ইনহেরিটেন্স মডেল নির্ধারণ করে।
Step 2: Database Schema
Person টেবিল:
id name email 1 John john@example.com Employee টেবিল:
id department 1 HR Customer টেবিল:
id membershipLevel 2 Silver
এখানে, Employee এবং Customer টেবিল শুধুমাত্র তাদের নিজস্ব specific তথ্য ধারণ করে এবং Person টেবিলের id, name, এবং email ফিল্ডগুলির সাথে যুক্ত থাকে।
2. Table-per-Class Strategy
Table-per-Class Strategy তে প্রতিটি সাবক্লাসের জন্য একটি আলাদা টেবিল তৈরি হয় এবং এতে ক্লাসের সকল ফিল্ড (superclass এবং subclass) থাকে। এখানে JOIN এর কোনো প্রয়োজন হয় না, কারণ প্রতিটি ক্লাসের জন্য সম্পূর্ণ তথ্য তার নিজস্ব টেবিলেই থাকে।
Table-per-Class Strategy উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String email;
// Getter and Setter methods
}
@Entity
public class Employee extends Person {
private String department;
// Getter and Setter methods
}
@Entity
public class Customer extends Person {
private String membershipLevel;
// Getter and Setter methods
}
এখানে, @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) অ্যানোটেশন ব্যবহার করা হয়েছে, যা Table-per-Class Strategy কে নির্দেশ করে।
Step 2: Database Schema
Person টেবিল:
id name email 1 John john@example.com Employee টেবিল:
id name email department 1 John john@example.com HR Customer টেবিল:
id name email membershipLevel 2 Alice alice@example.com Silver
এখানে, Person টেবিলের ডেটা Employee এবং Customer টেবিলেও ডুপ্লিকেট থাকে, কারণ প্রতিটি টেবিলের সব ফিল্ড (superclass + subclass) আলাদা টেবিলে রয়েছে।
পার্থক্য - Joined Strategy এবং Table-per-Class Strategy
| বৈশিষ্ট্য | Joined Strategy | Table-per-Class Strategy |
|---|---|---|
| টেবিল সংখ্যা | তিনটি টেবিল, একটি superclass এবং দুটি subclass টেবিল | প্রতিটি ক্লাসের জন্য আলাদা একটি টেবিল |
| ডেটা ডুপ্লিকেশন | কম, কারণ শুধুমাত্র subclass specific ডেটা টেবিলে থাকে | বেশি, কারণ superclass এবং subclass ডেটা আলাদা টেবিলে থাকে |
| পারফরম্যান্স | কিছুটা ধীর, কারণ JOIN অপারেশন প্রয়োজন | দ্রুত, কারণ ডেটা আলাদা টেবিলে থাকে এবং JOIN এর প্রয়োজন হয় না |
| নরমালাইজেশন | অধিক নরমালাইজড | কম নরমালাইজড |
| ডেটাবেসের স্টোরেজ | কম স্টোরেজ প্রয়োজন (শেয়ারড তথ্য) | বেশি স্টোরেজ প্রয়োজন (ডুপ্লিকেট ডেটা) |
| কোডিং সহজতা | সাবলীল, তবে JOIN প্রয়োজন | সহজ, কারণ ডেটা আলাদা টেবিলে থাকে |
সারাংশ
JPA Inheritance ব্যবহারে দুটি প্রধান স্ট্র্যাটেজি হল Joined Strategy এবং Table-per-Class Strategy। Joined Strategy ডেটাবেসে অবজেক্টর মধ্যে সম্পর্ক স্থাপন করে (JOIN), যেখানে ডেটা নরমালাইজড থাকে, কিন্তু পারফরম্যান্স কিছুটা কম হতে পারে। Table-per-Class Strategy সব ডেটা আলাদা টেবিলে রাখে, যার ফলে পারফরম্যান্স উন্নত হয়, তবে ডেটার ডুপ্লিকেশন এবং স্টোরেজের সমস্যা হতে পারে। আপনার প্রজেক্টের প্রয়োজন অনুযায়ী আপনি যে কোনো স্ট্র্যাটেজি নির্বাচন করতে পারেন।
Read more