JPA Inheritance Mapping

Java Technologies - স্প্রিং বুট জেপিএ (Spring Boot JPA)
131
131

JPA Inheritance Mapping এর ধারণা

Inheritance Mapping হল JPA (Java Persistence API) এর একটি বৈশিষ্ট্য, যা জাভা অবজেক্টের ইনহেরিটেন্স সম্পর্ককে ডেটাবেস টেবিলের সাথে মানানসই করতে সাহায্য করে। এটি ইনহেরিটেন্সের ভিত্তিতে ক্লাসের মধ্যে সম্পর্কগুলি ডেটাবেসের টেবিলগুলোর মধ্যে সঠিকভাবে মানানসই করার জন্য ব্যবহৃত হয়।

JPA Inheritance Mapping মূলত ডেটাবেস টেবিল এবং অবজেক্ট ওরিয়েন্টেড মডেল (OOP) এর মধ্যে সম্পর্ক স্থাপন করে, যাতে অবজেক্টের ইনহেরিটেন্স হায়ারার্কি টেবিলগুলোর মধ্যে প্রতিফলিত হয়। JPA তে ইনহেরিটেন্স মেপিংয়ের জন্য তিনটি প্রধান পদ্ধতি রয়েছে:

  1. Single Table Inheritance (Single Table Strategy)
  2. Joined Table Inheritance (Joined Strategy)
  3. Table Per Class Inheritance (Table Per Class Strategy)

এগুলো ডেটাবেস টেবিলের সৃষ্টির কৌশল, যার মাধ্যমে ইনহেরিটেন্স হায়ারার্কি সংরক্ষণ করা হয়।


১. Single Table Inheritance (Single Table Strategy)

এই পদ্ধতিতে, সার্বিক ইনহেরিটেন্স হায়ারার্কি একটি একক টেবিল-এ সংরক্ষিত হয়। সমস্ত ক্লাসের জন্য একটি সাধারণ টেবিল তৈরি করা হয় এবং প্রতিটি সাবক্লাসের জন্য একটি ডিসক্রিমিনেটর কলাম থাকে, যা সাবক্লাস চিহ্নিত করে।

উদাহরণ:

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 এ সংরক্ষিত হবে।

টেবিলের গঠন:

IDNameVehicle_TypeWheelsHas_Pedals
1Car 1Car4NULL
2Bike 1BikeNULLtrue

২. Joined Table Inheritance (Joined Strategy)

এই পদ্ধতিতে, প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি করা হয়, কিন্তু বেস ক্লাসের টেবিলটি সাবক্লাসের জন্য 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 টেবিলের সাথে যুক্ত থাকে।


৩. Table Per Class Inheritance (Table Per Class Strategy)

এই পদ্ধতিতে, প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি করা হয় এবং প্রতিটি টেবিলেই সমস্ত ফিল্ড থাকে (বেস ক্লাসের ফিল্ডও অন্তর্ভুক্ত)। কোন 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 এর সুবিধা

  1. ডেটাবেস ডিজাইন এর নমনীয়তা: ইনহেরিটেন্স সম্পর্ক ডেটাবেসে মডেল করার জন্য বিভিন্ন পদ্ধতি সরবরাহ করে (Single Table, Joined, Table Per Class)।
  2. এন্টিটি সম্পর্ক উন্নত করা: আপনি ইনহেরিটেন্স সম্পর্কের মাধ্যমে একাধিক ক্লাসের মধ্যে সাধারণ বৈশিষ্ট্যগুলি সংজ্ঞায়িত করতে পারেন এবং ডেটাবেসে তা অটোমেটিকভাবে সঞ্চয় করতে পারেন।
  3. টেবিল ডিজাইনের সুনির্দিষ্টতা: বিভিন্ন ইনহেরিটেন্স স্ট্র্যাটেজি ডেটাবেস টেবিলের মধ্যে ডেটার মডুলারিটি এবং পারফরম্যান্সের সুবিধা দেয়।
  4. ডিপেনডেন্সি ম্যানেজমেন্ট: ইনহেরিটেন্স পদ্ধতি ব্যবহার করে আপনি কাস্টম কোডে পুনঃব্যবহারযোগ্যতা এবং সহজ রক্ষণাবেক্ষণ নিশ্চিত করতে পারেন।

সারাংশ

JPA Inheritance Mapping একটি শক্তিশালী ফিচার যা Single Table, Joined Table এবং Table Per Class পদ্ধতি ব্যবহার করে ডেটাবেসে ইনহেরিটেন্স সম্পর্ক মডেল করতে সাহায্য করে। Single Table পদ্ধতিতে সমস্ত ডেটা একটি টেবিলে রাখা হয়, Joined Table পদ্ধতিতে বিভিন্ন টেবিলের মধ্যে সম্পর্ক তৈরি হয়, এবং Table Per Class পদ্ধতিতে প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয়। JPA ইনহেরিটেন্স মেপিং ডেটাবেসের সঙ্গে অবজেক্ট-অরিয়েন্টেড মডেল (OOP) এর সম্পর্ক তৈরি করতে সহায়ক এবং ডেটাবেসের কার্যক্ষমতা এবং ডিজাইন সহজে পরিচালিত করতে সক্ষম।

Content added By

JPA এর Inheritance কনসেপ্ট এবং প্রয়োজনীয়তা

83
83

JPA Inheritance কি?

JPA Inheritance হলো একটি কনসেপ্ট যা Object-Relational Mapping (ORM) এর মাধ্যমে অবজেক্টের বিভিন্ন শ্রেণি (classes) এর মধ্যে সম্পর্ক স্থাপন করে। JPA-এ Inheritance ব্যবহৃত হয় একটি বেস ক্লাস থেকে ডেরাইভড (derived) ক্লাস গুলি তৈরি করার জন্য। এই কনসেপ্টটি সাধারণত inheritance hierarchy গঠন করতে ব্যবহৃত হয়, যেখানে প্যারেন্ট ক্লাসের প্রপার্টি এবং মেথড গুলি সাবক্লাসের মধ্যে উত্তরাধিকারী হয়ে থাকে।

JPA Inheritance-এ তিনটি প্রধান স্ট্র্যাটেজি রয়েছে:

  1. Single Table Inheritance (STI)
  2. Joined Table Inheritance (JTI)
  3. Table Per Class Inheritance (TPC)

এগুলি JPA Entity ক্লাসের মধ্যে ইনহেরিটেন্স কনফিগারেশন করার বিভিন্ন উপায় প্রদান করে।


JPA Inheritance স্ট্র্যাটেজি

১. Single Table Inheritance (STI)

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 এর মাধ্যমে প্রতিটি সাবক্লাসের জন্য আলাদা মান নির্ধারণ করা হবে।

ডাটাবেস টেবিল

idnameemployee_typesalaryhourlyRate
1John DoeFULL_TIME50000NULL
2Jane SmithPART_TIMENULL20

২. Joined Table Inheritance (JTI)

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
}

ডাটাবেস টেবিল

  1. Employee Table
    | id | name | |----|-----------| | 1 | John Doe | | 2 | Jane Smith|
  2. FullTimeEmployee Table
    | id | salary | |----|---------| | 1 | 50000 |
  3. PartTimeEmployee Table
    | id | hourlyRate | |----|------------| | 2 | 20 |

এখানে, FullTimeEmployee এবং PartTimeEmployee টেবিল প্যারেন্ট ক্লাস Employee টেবিলের সাথে যোগ (join) করা হয়।


৩. Table Per Class Inheritance (TPC)

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
}

ডাটাবেস টেবিল

  1. Employee Table
    | id | name | |----|-----------| | 1 | John Doe | | 2 | Jane Smith|
  2. FullTimeEmployee Table
    | id | name | salary | |----|-----------|--------| | 1 | John Doe | 50000 |
  3. PartTimeEmployee Table
    | id | name | hourlyRate | |----|------------|------------| | 2 | Jane Smith | 20 |

এখানে, প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল তৈরি করা হয়েছে, যেখানে Employee ক্লাসের সাধারণ তথ্য প্রতিটি টেবিলেই কপি করা হয়েছে।


JPA Inheritance এর প্রয়োজনীয়তা

  1. Code Reusability:
    ইনহেরিটেন্সের মাধ্যমে একাধিক ক্লাস একই বৈশিষ্ট্য বা প্রপার্টি শেয়ার করতে পারে, যা কোড পুনঃব্যবহারযোগ্য করে তোলে এবং সিস্টেমের মধ্যে ডুপ্লিকেট কোড কমিয়ে আনে।
  2. Modeling Real-World Entities:
    ইনহেরিটেন্সের মাধ্যমে আপনি বাস্তব জগতের সম্পর্কগুলো যথাযথভাবে মডেল করতে পারেন। যেমন Employee ক্লাসের মাধ্যমে আপনি সাধারণ কর্মচারী মডেল করতে পারেন, এবং তারপর FullTimeEmployee এবং PartTimeEmployee দিয়ে বিশেষ ধরনের কর্মচারী মডেল করতে পারেন।
  3. Data Integrity:
    ইনহেরিটেন্স ব্যবহার করলে ডাটাবেসের নকশা পরিষ্কার এবং কাস্টমাইজযোগ্য হয়। Joined বা Single Table স্ট্র্যাটেজি ব্যবহার করলে ডেটা পুনরাবৃত্তি কমানো যায় এবং ডেটার ইন্টিগ্রিটি বজায় থাকে।
  4. Simplified Database Design:
    Inheritance ব্যবহার করলে সম্পর্কিত ডেটা সংরক্ষণ সহজ হয় এবং ডাটাবেস নকশা আরো পরিষ্কার এবং সংহত হয়।

সারাংশ

JPA-এ Inheritance ব্যবহারের মাধ্যমে আপনি ক্লাসের মধ্যে সম্পর্ক স্থাপন করতে পারেন এবং Single Table Inheritance, Joined Table Inheritance, এবং Table Per Class Inheritance স্ট্র্যাটেজি অনুসারে ডাটাবেস টেবিলের সাথে Entity গুলি ম্যাপ করতে পারেন। ইনহেরিটেন্স ডেটাবেস ডিজাইনে কোড পুনঃব্যবহার, ডেটার ইন্টিগ্রিটি এবং বাস্তব জগতের মডেলিংয়ের সুবিধা প্রদান করে। JPA Inheritance ব্যবহারের মাধ্যমে আপনি বিভিন্ন ধরনের সম্পর্ক এবং অবজেক্ট মডেলিং খুব সহজেই করতে পারেন।

Content added By

Table-per-Class, Single Table, এবং Joined Table Inheritance Strategy

91
91

Spring Boot JPA এর মাধ্যমে inheritance mapping সাধারণত ডাটাবেজ টেবিলগুলোর মধ্যে অবজেক্ট-ওরিয়েন্টেড ইনহেরিটেন্স সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়। JPA (Java Persistence API) ৩টি প্রধান inheritance mapping কৌশল সমর্থন করে: Single Table, Table-per-Class, এবং Joined Table। প্রতিটি কৌশল ডেটাবেজের টেবিল গঠন এবং সম্পর্কের জন্য ভিন্ন উপায় প্রদান করে।

Inheritance Mapping এর উদ্দেশ্য

Inheritance Mapping ব্যবহৃত হয় যখন আপনি একটি মডেলকে অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে তৈরি করেন এবং তারপর সেই মডেলটিকে ডাটাবেজ টেবিলের মধ্যে ম্যাপ করতে চান। JPA তে, Inheritance Mapping এর মাধ্যমে বিভিন্ন সাবক্লাসের তথ্য মূল ক্লাসের সাথে যুক্ত করতে পারবেন।

Spring Boot JPA-তে Inheritance Mapping-এর জন্য তিনটি প্রধান কৌশল:

  1. Single Table Strategy
  2. Table-per-Class Strategy
  3. Joined Table Strategy

এই কৌশলগুলো JPA Entity ক্লাসগুলির মধ্যে ইনহেরিটেন্স সম্পর্ক তৈরি করার জন্য ব্যবহৃত হয়।


১. Single Table Strategy

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 একটি অ্যাবস্ট্র্যাক্ট ক্লাস, এবং FullTimeEmployeePartTimeEmployee হল দুটি সাবক্লাস। সমস্ত ডেটা Employee টেবিলেই থাকবে, যেখানে employee_type কলাম দ্বারা সাবক্লাসগুলি আলাদা হবে।


২. Table-per-Class Strategy

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

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 প্রয়োগের তিনটি প্রধান কৌশল:

  1. Single Table Strategy: একটি টেবিলের মধ্যে সমস্ত সাবক্লাসের ডেটা জমা হয়, এবং discriminator column দিয়ে সাবক্লাসগুলি চিহ্নিত করা হয়।
  2. Table-per-Class Strategy: প্রতিটি সাবক্লাসের জন্য আলাদা টেবিল তৈরি হয়, তবে এতে কিছু স্টোরেজ পুনরাবৃত্তি থাকতে পারে।
  3. Joined Table Strategy: প্রতিটি ক্লাসের জন্য আলাদা টেবিল তৈরি হয় এবং join এর মাধ্যমে সম্পর্ক স্থাপন করা হয়, যা ডেটাবেস ডিজাইনে স্টোরেজের দক্ষতা বাড়ায়, তবে পারফরম্যান্সে কিছু প্রভাব ফেলতে পারে।

এই তিনটি কৌশল আপনাকে JPA Entity গুলির মধ্যে ইনহেরিটেন্স ম্যাপিং করার জন্য সুবিধা প্রদান করে, এবং আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং স্টোরেজ প্রয়োজন অনুযায়ী যেকোনো একটি কৌশল বেছে নিতে পারেন।

Content added By

উদাহরণ সহ JPA Inheritance Mapping

84
84

JPA Inheritance Mapping হল একটি কৌশল যা Inheritance (উত্তরণ) কনসেপ্টের মাধ্যমে একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে সাহায্য করে। যখন আপনি Inheritance ব্যবহার করেন, তখন একটি Superclass (সুপার ক্লাস) থাকবে এবং এক বা একাধিক Subclass (সাব ক্লাস) থাকবে। JPA-তে ইনহেরিটেন্স মেপিং আপনাকে এই সম্পর্কটিকে ডেটাবেস টেবিলের মাধ্যমে বাস্তবায়ন করতে সহায়তা করে।

JPA তে ইনহেরিটেন্স মেপিংয়ের তিনটি প্রধান কৌশল রয়েছে:

  1. Single Table Inheritance (একক টেবিল ইনহেরিটেন্স)
  2. Joined Table Inheritance (জয়েন টেবিল ইনহেরিটেন্স)
  3. Table per Class Inheritance (প্রতিটি ক্লাসের জন্য একটি টেবিল)

এই টিউটোরিয়ালে আমরা Spring Boot JPA ব্যবহার করে প্রতিটি ইনহেরিটেন্স মেপিং কৌশল বিশ্লেষণ করব এবং উদাহরণের মাধ্যমে দেখাব।


1. Single Table Inheritance

এই কৌশলে, সমস্ত সুপার ক্লাস এবং সাব ক্লাসের ডেটা একটি টেবিলেই সংরক্ষিত হয়। সব ফিল্ড একই টেবিলের মধ্যে থাকে, এবং প্রতিটি রেকর্ডে একটি ডিসটিংগুইশিং কলাম থাকে যা ক্লাসের ধরন নির্দেশ করে।

উদাহরণ: Single Table Inheritance

Super Class: 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
}

Sub Class: Manager

import javax.persistence.*;

@Entity
@DiscriminatorValue("Manager")
public class Manager extends Employee {

    private String department;

    // Getters and Setters
}

Sub Class: 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 এর মাধ্যমে সাব ক্লাসের ধরন নির্ধারণ করা হয়।


2. Joined Table Inheritance

এই কৌশলে, প্রতি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি হয়, তবে টেবিলগুলোর মধ্যে সম্পর্ক থাকে। Superclass এর টেবিল শুধুমাত্র কমন ফিল্ডগুলিকে ধারণ করবে এবং Subclass এর টেবিলগুলি তাদের নিজস্ব ফিল্ড ধারণ করবে। টেবিলগুলির মধ্যে সম্পর্ক foreign key এর মাধ্যমে তৈরি হয়।

উদাহরণ: Joined Table Inheritance

Super Class: 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
}

Sub Class: Manager

import javax.persistence.*;

@Entity
public class Manager extends Employee {

    private String department;

    // Getters and Setters
}

Sub Class: 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 এর মাধ্যমে।


3. Table per Class Inheritance

এই কৌশলে, প্রতিটি ক্লাসের জন্য আলাদা আলাদা টেবিল তৈরি হয় এবং প্রতি টেবিলই নিজের ফিল্ড ধারণ করে, তবে কোনো foreign key সম্পর্ক থাকে না। এই পদ্ধতিতে, একটি ক্লাসের জন্য একটি টেবিল তৈরি হয়, যা শুধুমাত্র সেই ক্লাসের জন্য নির্দিষ্ট ডেটা ধারণ করে।

উদাহরণ: Table per Class Inheritance

Super Class: 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
}

Sub Class: Manager

import javax.persistence.*;

@Entity
public class Manager extends Employee {

    private String department;

    // Getters and Setters
}

Sub Class: 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 হল একটি শক্তিশালী কৌশল যা ক্লাসের মধ্যে ইনহেরিটেন্স সম্পর্ক তৈরি করতে সাহায্য করে এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে। তিনটি প্রধান ইনহেরিটেন্স স্ট্র্যাটেজি রয়েছে:

  1. Single Table Inheritance: সব ক্লাসের ডেটা একটি টেবিলেই সংরক্ষিত হয় এবং @DiscriminatorColumn এর মাধ্যমে আলাদা করা হয়।
  2. Joined Table Inheritance: প্রতিটি ক্লাসের জন্য আলাদা টেবিল থাকে এবং টেবিলগুলির মধ্যে সম্পর্ক থাকে।
  3. Table per Class Inheritance: প্রতিটি ক্লাসের জন্য আলাদা টেবিল থাকে এবং কোনো foreign key সম্পর্ক থাকে না।

Spring Boot JPA এর মাধ্যমে এই ইনহেরিটেন্স মেপিংগুলো সহজেই বাস্তবায়ন করা যায়, এবং এটি ডেটাবেস ডিজাইন এবং অ্যাপ্লিকেশনের কোড মেইনটেইন করার জন্য খুবই উপকারী।

Content added By
টপ রেটেড অ্যাপ

স্যাট অ্যাকাডেমী অ্যাপ

আমাদের অল-ইন-ওয়ান মোবাইল অ্যাপের মাধ্যমে সীমাহীন শেখার সুযোগ উপভোগ করুন।

ভিডিও
লাইভ ক্লাস
এক্সাম
ডাউনলোড করুন
Promotion