JPA (Java Persistence API) ডেটাবেসের সাথে সম্পর্কিত অবজেক্ট-রিলেশনাল ম্যাপিং (ORM) এর একটি অংশ যা অবজেক্টের ক্লাস হায়ারার্কি (অর্থাৎ, ইনহেরিটেন্স) টেবিলের মধ্যে ম্যাপ করে। JPA-তে ক্লাস হায়ারার্কি পরিচালনার জন্য @Inheritance অ্যানোটেশন ব্যবহার করা হয় এবং এর মাধ্যমে একটি নির্দিষ্ট স্ট্র্যাটেজি নির্বাচন করা হয়। একাধিক ইনহেরিটেন্স স্ট্র্যাটেজি রয়েছে, তার মধ্যে একটি হলো Single Table Strategy।
Single Table Strategy কী?
Single Table Strategy (বা SINGLE_TABLE ইনহেরিটেন্স স্ট্র্যাটেজি) হলো একটি পদ্ধতি যেখানে বিভিন্ন শ্রেণীর (subclasses) ডেটা একটি একক টেবিল এ সঞ্চিত হয়। অর্থাৎ, পারেন্ট এবং সাবক্লাসের সকল ফিল্ড একটি একক টেবিলের মধ্যে থাকবে, এবং type discriminator column ব্যবহৃত হয় যাতে প্রতিটি রেকর্ড বুঝতে পারে যে এটি কোন ক্লাসের অবজেক্ট।
এটি সবচেয়ে সাধারণ এবং সহজ ইনহেরিটেন্স স্ট্র্যাটেজি, যেখানে সবকিছু একটি টেবিলে রাখা হয়। তবে, টেবিলটি বড় হয়ে যেতে পারে যদি অনেক সাবক্লাস এবং ক্ষেত্র থাকে, কারণ সমস্ত ক্ষেত্র একে অপরের সাথে শেয়ার করা হয়।
Single Table Strategy ব্যবহারের জন্য @Inheritance অ্যানোটেশন
JPA-তে @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ব্যবহার করে ইনহেরিটেন্স হায়ারার্কি তৈরি করা হয় যেখানে সব ক্লাসের ডেটা একক টেবিলে রাখা হয়।
উদাহরণ: Single Table Strategy
ধরা যাক, আমাদের একটি প্যারেন্ট ক্লাস Vehicle এবং এর দুইটি সাবক্লাস Car এবং Truck রয়েছে। এই সমস্ত ডেটা একটি টেবিলে সঞ্চিত থাকবে।
Step 1: Entity Class তৈরি করা
Parent Class (Vehicle):
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) // Single Table Strategy
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Vehicle {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String make;
private String model;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getMake() {
return make;
}
public void setMake(String make) {
this.make = make;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
}
এখানে, @Inheritance(strategy = InheritanceType.SINGLE_TABLE) ব্যবহার করা হয়েছে, যার মাধ্যমে Vehicle ক্লাসের সব ডেটা একটিমাত্র টেবিলেই সঞ্চিত হবে। এছাড়াও, @DiscriminatorColumn ব্যবহার করে একটি discriminator column (vehicle_type) নির্ধারণ করা হয়েছে যা এই টেবিলের মধ্যে নির্ধারণ করবে কোন রেকর্ডটি Car বা Truck ক্লাসের অন্তর্ভুক্ত।
Child Class (Car):
import javax.persistence.*;
@Entity
@DiscriminatorValue("Car") // Discriminator value for the Car class
public class Car extends Vehicle {
private int doors;
// Getters and Setters
public int getDoors() {
return doors;
}
public void setDoors(int doors) {
this.doors = doors;
}
}
এখানে, @DiscriminatorValue("Car") ব্যবহার করে Car ক্লাসের জন্য একটি নির্দিষ্ট ডিসক্রিমিনেটর ভ্যালু (এক্ষেত্রে "Car") দেওয়া হয়েছে, যা Vehicle টেবিলের ডিসক্রিমিনেটর কলামে সঞ্চিত থাকবে।
Child Class (Truck):
import javax.persistence.*;
@Entity
@DiscriminatorValue("Truck") // Discriminator value for the Truck class
public class Truck extends Vehicle {
private double loadCapacity;
// Getters and Setters
public double getLoadCapacity() {
return loadCapacity;
}
public void setLoadCapacity(double loadCapacity) {
this.loadCapacity = loadCapacity;
}
}
এখানে, @DiscriminatorValue("Truck") ব্যবহার করে Truck ক্লাসের জন্য ডিসক্রিমিনেটর ভ্যালু "Truck" দেওয়া হয়েছে।
Step 2: Database Table Structure
এই কনফিগারেশনের মাধ্যমে JPA একটি একক টেবিল তৈরি করবে যা Vehicle ক্লাসের এবং তার সাবক্লাস Car এবং Truck ক্লাসের ডেটা সঞ্চিত রাখবে। টেবিলের কাঠামো হবে এমন:
| id | make | model | vehicle_type | doors | loadCapacity |
|---|---|---|---|---|---|
| 1 | Toyota | Corolla | Car | 4 | null |
| 2 | Ford | F-150 | Truck | null | 2000 |
এখানে:
- vehicle_type কলামটি ডিসক্রিমিনেটর হিসেবে কাজ করে যা নির্দেশ করে যে এটি
CarবাTruckক্লাসের ডেটা। doorsএবংloadCapacityফিল্ডগুলি শুধুমাত্র তাদের সংশ্লিষ্ট সাবক্লাসের জন্য প্রযোজ্য।
Step 3: EntityManager দিয়ে ডেটা সঞ্চয়
JPA ব্যবহার করে এই Entity গুলি সেভ করার সময়, আপনি একটি সাধারণ EntityManager ব্যবহার করতে পারেন। নিম্নলিখিত কোডে একটি উদাহরণ দেওয়া হল:
import javax.persistence.*;
public class VehicleTest {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// Creating and persisting a Car
Car car = new Car();
car.setMake("Toyota");
car.setModel("Corolla");
car.setDoors(4);
em.persist(car);
// Creating and persisting a Truck
Truck truck = new Truck();
truck.setMake("Ford");
truck.setModel("F-150");
truck.setLoadCapacity(2000);
em.persist(truck);
em.getTransaction().commit();
em.close();
emf.close();
}
}
এখানে, Car এবং Truck অবজেক্টগুলো Vehicle টেবিলের একক টেবিলে সেভ করা হবে, যেখানে vehicle_type ডিসক্রিমিনেটর কলামটি Car এবং Truck হিসাবে শনাক্ত করবে।
সারাংশ
Single Table Strategy (SINGLE_TABLE) JPA ইনহেরিটেন্স স্ট্র্যাটেজির একটি অংশ, যেখানে প্যারেন্ট এবং সাবক্লাসের ডেটা একটি একক টেবিলের মধ্যে রাখা হয়। এতে @Entity এবং @Inheritance(strategy = InheritanceType.SINGLE_TABLE) অ্যানোটেশন ব্যবহার করে ক্লাস হায়ারার্কি তৈরি করা হয় এবং @DiscriminatorColumn এবং @DiscriminatorValue ব্যবহার করে প্রতিটি সাবক্লাসের জন্য ডিসক্রিমিনেটর কলাম সংজ্ঞায়িত করা হয়। এটি ডেটাবেসের মধ্যে এক টেবিলে সব তথ্য সংরক্ষণ করে, যার ফলে পারফরম্যান্সে কিছুটা পার্থক্য হতে পারে তবে এটি সিম্পল এবং সহজ প্রয়োগযোগ্য।
Read more