Inheritance Mapping হল JPA (Java Persistence API) এর একটি বৈশিষ্ট্য, যা জাভা অবজেক্টের ইনহেরিটেন্স সম্পর্ককে ডেটাবেস টেবিলের সাথে মানানসই করতে সাহায্য করে। এটি ইনহেরিটেন্সের ভিত্তিতে ক্লাসের মধ্যে সম্পর্কগুলি ডেটাবেসের টেবিলগুলোর মধ্যে সঠিকভাবে মানানসই করার জন্য ব্যবহৃত হয়।
JPA Inheritance Mapping মূলত ডেটাবেস টেবিল এবং অবজেক্ট ওরিয়েন্টেড মডেল (OOP) এর মধ্যে সম্পর্ক স্থাপন করে, যাতে অবজেক্টের ইনহেরিটেন্স হায়ারার্কি টেবিলগুলোর মধ্যে প্রতিফলিত হয়। JPA তে ইনহেরিটেন্স মেপিংয়ের জন্য তিনটি প্রধান পদ্ধতি রয়েছে:
এগুলো ডেটাবেস টেবিলের সৃষ্টির কৌশল, যার মাধ্যমে ইনহেরিটেন্স হায়ারার্কি সংরক্ষণ করা হয়।
এই পদ্ধতিতে, সার্বিক ইনহেরিটেন্স হায়ারার্কি একটি একক টেবিল-এ সংরক্ষিত হয়। সমস্ত ক্লাসের জন্য একটি সাধারণ টেবিল তৈরি করা হয় এবং প্রতিটি সাবক্লাসের জন্য একটি ডিসক্রিমিনেটর কলাম থাকে, যা সাবক্লাস চিহ্নিত করে।
import javax.persistence.DiscriminatorColumn;
import javax.persistence.DiscriminatorType;
import javax.persistence.Entity;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.Table;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING)
public class Vehicle {
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class Car extends Vehicle {
private int wheels;
// Getters and Setters
}
@Entity
public class Bike extends Vehicle {
private boolean hasPedals;
// Getters and Setters
}
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
: এটি ইনহেরিটেন্স স্ট্র্যাটেজি নির্বাচন করে যা Single Table ব্যবহার করবে।@DiscriminatorColumn(name = "vehicle_type")
: ডিসক্রিমিনেটর কলামটি ব্যবহার করে ডেটাবেসে ক্লাসগুলো আলাদা করা হয়।Vehicle
, Car
, এবং Bike
সব একক টেবিল Vehicle
এ সংরক্ষিত হবে।টেবিলের গঠন:
ID | Name | Vehicle_Type | Wheels | Has_Pedals |
---|---|---|---|---|
1 | Car 1 | Car | 4 | NULL |
2 | Bike 1 | Bike | NULL | true |
এই পদ্ধতিতে, প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি করা হয়, কিন্তু বেস ক্লাসের টেবিলটি সাবক্লাসের জন্য foreign key সম্পর্ক রাখে। অর্থাৎ, সাবক্লাসের টেবিল বেস ক্লাসের টেবিলের সাথে যোগ করা হয়।
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Vehicle {
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class Car extends Vehicle {
private int wheels;
// Getters and Setters
}
@Entity
public class Bike extends Vehicle {
private boolean hasPedals;
// Getters and Setters
}
@Inheritance(strategy = InheritanceType.JOINED)
: এটি ইনহেরিটেন্স স্ট্র্যাটেজি নির্বাচন করে যা Joined পদ্ধতি ব্যবহার করবে।Vehicle
, Car
, এবং Bike
ক্লাসগুলির জন্য আলাদা টেবিল তৈরি হবে।টেবিলের গঠন:
Vehicle
টেবিল: | ID | Name | |----|-------| | 1 | Car 1 | | 2 | Bike 1|Car
টেবিল: | ID | Wheels | |----|--------| | 1 | 4 |Bike
টেবিল: | ID | Has_Pedals | |----|------------| | 2 | true |এখানে, Car
এবং Bike
টেবিল তাদের প্রাথমিক কী ID
ব্যবহার করে Vehicle
টেবিলের সাথে যুক্ত থাকে।
এই পদ্ধতিতে, প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি করা হয় এবং প্রতিটি টেবিলেই সমস্ত ফিল্ড থাকে (বেস ক্লাসের ফিল্ডও অন্তর্ভুক্ত)। কোন foreign key
সম্পর্ক থাকে না এবং সাবক্লাসের টেবিলগুলোতে বেস ক্লাসের সমস্ত প্রোপার্টি পুনরাবৃত্তি হয়।
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Vehicle {
private Long id;
private String name;
// Getters and Setters
}
@Entity
public class Car extends Vehicle {
private int wheels;
// Getters and Setters
}
@Entity
public class Bike extends Vehicle {
private boolean hasPedals;
// Getters and Setters
}
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
: এটি Table Per Class পদ্ধতি ব্যবহার করে, যেখানে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়।Vehicle
, Car
, এবং Bike
ক্লাসগুলির জন্য আলাদা টেবিল তৈরি হবে।টেবিলের গঠন:
Vehicle
টেবিল: | ID | Name | |----|-------| | 1 | Car 1 | | 2 | Bike 1|Car
টেবিল: | ID | Name | Wheels | |----|-------|--------| | 1 | Car 1 | 4 |Bike
টেবিল: | ID | Name | Has_Pedals | |----|-------|------------| | 2 | Bike 1| true |এখানে, Car
এবং Bike
টেবিল আলাদাভাবে তাদের সমস্ত তথ্য ধারণ করে এবং কোনো foreign key
সম্পর্ক থাকে না।
JPA Inheritance Mapping একটি শক্তিশালী ফিচার যা Single Table, Joined Table এবং Table Per Class পদ্ধতি ব্যবহার করে ডেটাবেসে ইনহেরিটেন্স সম্পর্ক মডেল করতে সাহায্য করে। Single Table পদ্ধতিতে সমস্ত ডেটা একটি টেবিলে রাখা হয়, Joined Table পদ্ধতিতে বিভিন্ন টেবিলের মধ্যে সম্পর্ক তৈরি হয়, এবং Table Per Class পদ্ধতিতে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়। JPA ইনহেরিটেন্স মেপিং ডেটাবেসের সঙ্গে অবজেক্ট-অরিয়েন্টেড মডেল (OOP) এর সম্পর্ক তৈরি করতে সহায়ক এবং ডেটাবেসের কার্যক্ষমতা এবং ডিজাইন সহজে পরিচালিত করতে সক্ষম।
JPA Inheritance হলো একটি কনসেপ্ট যা Object-Relational Mapping (ORM) এর মাধ্যমে অবজেক্টের বিভিন্ন শ্রেণি (classes) এর মধ্যে সম্পর্ক স্থাপন করে। JPA-এ Inheritance ব্যবহৃত হয় একটি বেস ক্লাস থেকে ডেরাইভড (derived) ক্লাস গুলি তৈরি করার জন্য। এই কনসেপ্টটি সাধারণত inheritance hierarchy গঠন করতে ব্যবহৃত হয়, যেখানে প্যারেন্ট ক্লাসের প্রপার্টি এবং মেথড গুলি সাবক্লাসের মধ্যে উত্তরাধিকারী হয়ে থাকে।
JPA Inheritance-এ তিনটি প্রধান স্ট্র্যাটেজি রয়েছে:
এগুলি JPA Entity ক্লাসের মধ্যে ইনহেরিটেন্স কনফিগারেশন করার বিভিন্ন উপায় প্রদান করে।
Single Table Inheritance (STI) স্ট্র্যাটেজিতে সমস্ত ইনহেরিটেড ক্লাসের ডেটা একটি টেবিলেই স্টোর করা হয়। এখানে সব সাবক্লাসের জন্য একটি সাধারণ টেবিল ব্যবহার করা হয় এবং একটি discriminator column ব্যবহৃত হয়, যা নির্ধারণ করে কোন রেকর্ড কোন সাবক্লাসের অন্তর্গত। এই স্ট্র্যাটেজি পারফরম্যান্সে দ্রুত কিন্তু কিছু সময় ডেটা পুনরাবৃত্তি হতে পারে।
উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type")
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
@DiscriminatorValue("FULL_TIME")
public class FullTimeEmployee extends Employee {
private double salary;
// Getters and Setters
}
@Entity
@DiscriminatorValue("PART_TIME")
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Getters and Setters
}
এখানে, Employee
হল প্যারেন্ট ক্লাস এবং FullTimeEmployee
এবং PartTimeEmployee
হল সাবক্লাস। @DiscriminatorColumn
অ্যানোটেশনটি নির্দেশ করে যে ডাটাবেসে একাধিক ধরনের ডাটা রাখা হবে, এবং @DiscriminatorValue
এর মাধ্যমে প্রতিটি সাবক্লাসের জন্য আলাদা মান নির্ধারণ করা হবে।
ডাটাবেস টেবিল
id | name | employee_type | salary | hourlyRate |
---|---|---|---|---|
1 | John Doe | FULL_TIME | 50000 | NULL |
2 | Jane Smith | PART_TIME | NULL | 20 |
Joined Table Inheritance স্ট্র্যাটেজিতে প্রতিটি সাবক্লাসের জন্য একটি আলাদা টেবিল তৈরি করা হয় এবং প্যারেন্ট ক্লাসের টেবিলের সাথে join করা হয়। এই স্ট্র্যাটেজি ডেটার পুনরাবৃত্তি এড়াতে সাহায্য করে, কিন্তু এতে কিছু পারফরম্যান্স কমে যেতে পারে কারণ টেবিলের মধ্যে জয়েন অপারেশন প্রয়োজন।
উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public 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
}
ডাটাবেস টেবিল
এখানে, FullTimeEmployee
এবং PartTimeEmployee
টেবিল প্যারেন্ট ক্লাস Employee
টেবিলের সাথে যোগ (join) করা হয়।
Table Per Class Inheritance স্ট্র্যাটেজিতে প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল তৈরি হয় এবং এসব টেবিলের মধ্যে কোনো যোগ (join) নেই। এটি সাধারণত পারফরম্যান্সের জন্য উপকারী, কারণ এখানে ডাটাবেসের টেবিলগুলো স্বাধীন থাকে, কিন্তু এতে কিছু ডুপ্লিকেট ডেটা থাকতে পারে।
উদাহরণ:
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public 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
}
ডাটাবেস টেবিল
এখানে, প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল তৈরি করা হয়েছে, যেখানে Employee
ক্লাসের সাধারণ তথ্য প্রতিটি টেবিলেই কপি করা হয়েছে।
Employee
ক্লাসের মাধ্যমে আপনি সাধারণ কর্মচারী মডেল করতে পারেন, এবং তারপর FullTimeEmployee
এবং PartTimeEmployee
দিয়ে বিশেষ ধরনের কর্মচারী মডেল করতে পারেন।Joined
বা Single Table
স্ট্র্যাটেজি ব্যবহার করলে ডেটা পুনরাবৃত্তি কমানো যায় এবং ডেটার ইন্টিগ্রিটি বজায় থাকে।JPA-এ Inheritance ব্যবহারের মাধ্যমে আপনি ক্লাসের মধ্যে সম্পর্ক স্থাপন করতে পারেন এবং Single Table Inheritance, Joined Table Inheritance, এবং Table Per Class Inheritance স্ট্র্যাটেজি অনুসারে ডাটাবেস টেবিলের সাথে Entity গুলি ম্যাপ করতে পারেন। ইনহেরিটেন্স ডেটাবেস ডিজাইনে কোড পুনঃব্যবহার, ডেটার ইন্টিগ্রিটি এবং বাস্তব জগতের মডেলিংয়ের সুবিধা প্রদান করে। JPA Inheritance ব্যবহারের মাধ্যমে আপনি বিভিন্ন ধরনের সম্পর্ক এবং অবজেক্ট মডেলিং খুব সহজেই করতে পারেন।
Spring Boot JPA এর মাধ্যমে inheritance mapping সাধারণত ডাটাবেজ টেবিলগুলোর মধ্যে অবজেক্ট-ওরিয়েন্টেড ইনহেরিটেন্স সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়। JPA (Java Persistence API) ৩টি প্রধান inheritance mapping কৌশল সমর্থন করে: Single Table, Table-per-Class, এবং Joined Table। প্রতিটি কৌশল ডেটাবেজের টেবিল গঠন এবং সম্পর্কের জন্য ভিন্ন উপায় প্রদান করে।
Inheritance Mapping ব্যবহৃত হয় যখন আপনি একটি মডেলকে অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে তৈরি করেন এবং তারপর সেই মডেলটিকে ডাটাবেজ টেবিলের মধ্যে ম্যাপ করতে চান। JPA তে, Inheritance Mapping এর মাধ্যমে বিভিন্ন সাবক্লাসের তথ্য মূল ক্লাসের সাথে যুক্ত করতে পারবেন।
Spring Boot JPA-তে Inheritance Mapping-এর জন্য তিনটি প্রধান কৌশল:
এই কৌশলগুলো JPA Entity ক্লাসগুলির মধ্যে ইনহেরিটেন্স সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়।
Single Table Strategy হলো সবচেয়ে সহজ এবং জনপ্রিয় কৌশল যেখানে সমস্ত ইনহেরিটেড ক্লাসের জন্য একটি মাত্র টেবিল তৈরি হয়। সমস্ত সাবক্লাসের জন্য একটি সাধারণ টেবিল থাকবে, এবং discriminator column (একটি বিশেষ কলাম) ব্যবহার করে সাবক্লাসগুলি চিহ্নিত করা হবে। এই কৌশলে, সমস্ত ইনহেরিটেড ডেটা একটি টেবিলে জমা হয়, যার ফলে স্টোরেজ স্থান কমে যায়, কিন্তু এটি বড় স্কেল অ্যাপ্লিকেশনগুলিতে কিছু পারফরম্যান্স সমস্যা সৃষ্টি করতে পারে।
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type", discriminatorType = DiscriminatorType.STRING)
public abstract class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
// Getters and Setters
}
@Entity
@DiscriminatorValue("FULL_TIME")
public class FullTimeEmployee extends Employee {
private double salary;
// Getters and Setters
}
@Entity
@DiscriminatorValue("PART_TIME")
public class PartTimeEmployee extends Employee {
private double hourlyRate;
// Getters and Setters
}
এখানে, Employee
একটি অ্যাবস্ট্র্যাক্ট ক্লাস, এবং FullTimeEmployee
ও PartTimeEmployee
হল দুটি সাবক্লাস। সমস্ত ডেটা Employee
টেবিলেই থাকবে, যেখানে employee_type
কলাম দ্বারা সাবক্লাসগুলি আলাদা হবে।
Table-per-Class Strategy-এ প্রতিটি সাবক্লাসের জন্য একটি আলাদা টেবিল তৈরি হয়। এটি স্টোরেজ দিক থেকে আরও কার্যকর হতে পারে, কারণ প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল থাকে। তবে, এটি ডেটাবেসে reduntancy সৃষ্টি করতে পারে এবং joins এর প্রয়োজন হতে পারে।
@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
}
এখানে, Employee
, FullTimeEmployee
, এবং PartTimeEmployee
ক্লাসগুলির প্রতিটির জন্য আলাদা আলাদা টেবিল তৈরি হবে। এই কৌশলে কোনও discriminator column
ব্যবহৃত হয় না, এবং প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল থাকে।
Joined Table Strategy একটি মিক্সড পদ্ধতি যেখানে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়, তবে সকল টেবিলের মধ্যে একটি join সম্পর্ক স্থাপিত থাকে। এটি normalized পদ্ধতিতে ডেটাবেস ডিজাইন তৈরি করে, যেখানে প্রতিটি টেবিলের মধ্যে শুধুমাত্র নির্দিষ্ট তথ্য থাকে। যখন ডেটা ফেচ করা হয়, তখন এই টেবিলগুলি একত্রে join করা হয়।
join
অপারেশনগুলি ডেটার ফেচিং এর সময় পারফরম্যান্সে প্রভাব ফেলতে পারে।@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
}
এখানে, Employee
, FullTimeEmployee
, এবং PartTimeEmployee
ক্লাসের জন্য আলাদা টেবিল তৈরি হয়। Employee
টেবিলের মূল তথ্য থাকবে, এবং FullTimeEmployee
এবং PartTimeEmployee
টেবিলগুলি তাদের নির্দিষ্ট ডেটা ধারণ করবে, এবং join অপারেশন ব্যবহৃত হবে।
Spring Boot JPA তে Inheritance Mapping প্রয়োগের তিনটি প্রধান কৌশল:
discriminator column
দিয়ে সাবক্লাসগুলি চিহ্নিত করা হয়।এই তিনটি কৌশল আপনাকে JPA Entity গুলির মধ্যে ইনহেরিটেন্স ম্যাপিং করার জন্য সুবিধা প্রদান করে, এবং আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্টোরেজ প্রয়োজন অনুযায়ী যেকোনো একটি কৌশল বেছে নিতে পারেন।
JPA Inheritance Mapping হল একটি কৌশল যা Inheritance (উত্তরণ) কনসেপ্টের মাধ্যমে একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে সাহায্য করে। যখন আপনি Inheritance ব্যবহার করেন, তখন একটি Superclass (সুপার ক্লাস) থাকবে এবং এক বা একাধিক Subclass (সাব ক্লাস) থাকবে। JPA-তে ইনহেরিটেন্স মেপিং আপনাকে এই সম্পর্কটিকে ডেটাবেস টেবিলের মাধ্যমে বাস্তবায়ন করতে সহায়তা করে।
JPA তে ইনহেরিটেন্স মেপিংয়ের তিনটি প্রধান কৌশল রয়েছে:
এই টিউটোরিয়ালে আমরা Spring Boot JPA ব্যবহার করে প্রতিটি ইনহেরিটেন্স মেপিং কৌশল বিশ্লেষণ করব এবং উদাহরণের মাধ্যমে দেখাব।
এই কৌশলে, সমস্ত সুপার ক্লাস এবং সাব ক্লাসের ডেটা একটি টেবিলেই সংরক্ষিত হয়। সব ফিল্ড একই টেবিলের মধ্যে থাকে, এবং প্রতিটি রেকর্ডে একটি ডিসটিংগুইশিং কলাম থাকে যা ক্লাসের ধরন নির্দেশ করে।
Employee
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type", discriminatorType = DiscriminatorType.STRING)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
// Getters and Setters
}
Manager
import javax.persistence.*;
@Entity
@DiscriminatorValue("Manager")
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Developer
import javax.persistence.*;
@Entity
@DiscriminatorValue("Developer")
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এখানে, Employee
ক্লাস একটি superclass হিসাবে কাজ করছে এবং Manager
এবং Developer
ক্লাস দুটি subclass হিসাবে কাজ করছে। @Inheritance(strategy = InheritanceType.SINGLE_TABLE)
অ্যানোটেশন দিয়ে স্প্রিং স্পষ্টভাবে নির্দেশ করে যে সব ডেটা একটি টেবিলেই সংরক্ষিত হবে। @DiscriminatorColumn
দ্বারা একে আলাদা করা হয় এবং @DiscriminatorValue
এর মাধ্যমে সাব ক্লাসের ধরন নির্ধারণ করা হয়।
এই কৌশলে, প্রতি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি হয়, তবে টেবিলগুলোর মধ্যে সম্পর্ক থাকে। Superclass এর টেবিল শুধুমাত্র কমন ফিল্ডগুলিকে ধারণ করবে এবং Subclass এর টেবিলগুলি তাদের নিজস্ব ফিল্ড ধারণ করবে। টেবিলগুলির মধ্যে সম্পর্ক foreign key এর মাধ্যমে তৈরি হয়।
Employee
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
// Getters and Setters
}
Manager
import javax.persistence.*;
@Entity
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Developer
import javax.persistence.*;
@Entity
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এই কৌশলে, Employee
টেবিলটি শুধুমাত্র id
, name
, এবং address
ফিল্ড ধারণ করবে, আর Manager
টেবিলটি department
ফিল্ড এবং Developer
টেবিলটি programmingLanguage
ফিল্ড ধারণ করবে। Joined স্ট্র্যাটেজি ব্যবহারের মাধ্যমে Employee
টেবিল এবং তার subclasses (e.g., Manager
, Developer
) আলাদা টেবিল হতে হবে, তবে তাদের মধ্যে সম্পর্ক থাকে foreign key এর মাধ্যমে।
এই কৌশলে, প্রতিটি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি হয় এবং প্রতি টেবিলই নিজের ফিল্ড ধারণ করে, তবে কোনো foreign key সম্পর্ক থাকে না। এই পদ্ধতিতে, একটি ক্লাসের জন্য একটি টেবিল তৈরি হয়, যা শুধুমাত্র সেই ক্লাসের জন্য নির্দিষ্ট ডেটা ধারণ করে।
Employee
import javax.persistence.*;
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String address;
// Getters and Setters
}
Manager
import javax.persistence.*;
@Entity
public class Manager extends Employee {
private String department;
// Getters and Setters
}
Developer
import javax.persistence.*;
@Entity
public class Developer extends Employee {
private String programmingLanguage;
// Getters and Setters
}
এখানে, Employee
, Manager
এবং Developer
এর জন্য আলাদা আলাদা টেবিল তৈরি হবে। প্রতিটি টেবিল শুধুমাত্র তার ক্লাসের জন্য ডেটা ধারণ করবে। এই ক্ষেত্রে, স্প্রিং ডেটা JPA TABLE_PER_CLASS
স্ট্র্যাটেজি ব্যবহার করেছে, যার ফলে Employee
, Manager
, এবং Developer
ক্লাসগুলোর জন্য পৃথক টেবিল তৈরি হবে, তবে কোনো foreign key সম্পর্ক থাকবে না।
JPA Inheritance Mapping হল একটি শক্তিশালী কৌশল যা ক্লাসের মধ্যে ইনহেরিটেন্স সম্পর্ক তৈরি করতে সাহায্য করে এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে। তিনটি প্রধান ইনহেরিটেন্স স্ট্র্যাটেজি রয়েছে:
@DiscriminatorColumn
এর মাধ্যমে আলাদা করা হয়।Spring Boot JPA এর মাধ্যমে এই ইনহেরিটেন্স মেপিংগুলো সহজেই বাস্তবায়ন করা যায়, এবং এটি ডেটাবেস ডিজাইন এবং অ্যাপ্লিকেশনের কোড মেইনটেইন করার জন্য খুবই উপকারী।
Read more