Hibernate Mapping Techniques

Java Technologies - হাইবারনেট (Hibernate)
197
197

Hibernate হল একটি ওপেন সোর্স Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশন এবং রিলেশনাল ডেটাবেসের মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Hibernate ব্যবহার করে, আপনি Java objects এবং database tables এর মধ্যে ম্যাপিং করতে পারেন, যাতে Java অ্যাপ্লিকেশন সহজে ডেটাবেসের সাথে ইন্টারঅ্যাক্ট করতে পারে।

Hibernate Mapping Techniques হল বিভিন্ন পদ্ধতি যা আপনি ব্যবহার করতে পারেন Java objects এবং database tables এর মধ্যে সম্পর্ক স্থাপন করতে। Hibernate মূলত চারটি প্রধান ম্যাপিং পদ্ধতি ব্যবহার করে:

  1. One-to-One Mapping
  2. One-to-Many and Many-to-One Mapping
  3. Many-to-Many Mapping
  4. Inheritance Mapping

এই ম্যাপিংগুলো Java ক্লাস ও ডেটাবেস টেবিলের মধ্যে সম্পর্ক সঠিকভাবে এবং কার্যকরভাবে তৈরি করতে ব্যবহৃত হয়।


1. One-to-One Mapping

One-to-One Mapping হল সেই সম্পর্ক যেখানে একটি অবজেক্ট আরেকটি অবজেক্টের সাথে এক-একমাত্র সম্পর্ক স্থাপন করে। এটি সাধারণত দুটি টেবিলের মধ্যে একাধিক কনট্রোলিত সম্পর্ক তৈরি করে।

Example: One-to-One Mapping

ধরা যাক আমাদের দুটি ক্লাস Employee এবং Address রয়েছে। প্রতিটি Employee এর একটি Address থাকে এবং প্রতিটি Address একটি Employee এর সাথে সম্পর্কিত থাকে।

Employee Class

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address;

    // Constructors, Getters, and Setters
}

Address Class

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String street;
    private String city;

    // Constructors, Getters, and Setters
}

এখানে, Employee এবং Address ক্লাসের মধ্যে One-to-One Relationship প্রতিষ্ঠিত হয়েছে। @OneToOne অ্যানোটেশন দিয়ে এটি নির্ধারণ করা হয়েছে, এবং @JoinColumn ব্যবহার করে address_id কলামের মাধ্যমে সম্পর্ক স্থাপন করা হয়েছে।


2. One-to-Many and Many-to-One Mapping

One-to-Many এবং Many-to-One ম্যাপিং দুটি সম্পর্ক স্থাপন করে যেখানে একটি টেবিল একাধিক রেকর্ডের সাথে সম্পর্কিত হয়। এর মধ্যে One-to-Many সম্পর্ক primary side (একটি) টেবিলের সাথে সম্পর্কিত, আর Many-to-One সম্পর্ক inverse side (অনেকগুলি) টেবিলের সাথে সম্পর্কিত।

Example: One-to-Many and Many-to-One Mapping

ধরা যাক আমাদের দুটি ক্লাস Department এবং Employee রয়েছে। একেকটি Department-এ অনেক Employee থাকতে পারে, কিন্তু প্রতিটি Employee একটি Department-এর অন্তর্গত।

Department Class (One-to-Many)

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany(mappedBy = "department")
    private Set<Employee> employees;

    // Constructors, Getters, and Setters
}

Employee Class (Many-to-One)

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;

    // Constructors, Getters, and Setters
}

এখানে, Department ক্লাসে One-to-Many এবং Employee ক্লাসে Many-to-One সম্পর্ক স্থাপন করা হয়েছে। @OneToMany অ্যানোটেশন দিয়ে Department ক্লাসের মধ্যে একাধিক Employee সম্পর্ক তৈরি করা হয়েছে, আর @ManyToOne অ্যানোটেশন দিয়ে Employee ক্লাসে Department সম্পর্ক স্থাপন করা হয়েছে।


3. Many-to-Many Mapping

Many-to-Many Mapping হল সেই সম্পর্ক যেখানে একটি টেবিল একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে এবং অন্য টেবিলও একইভাবে একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। এই সম্পর্কটি সাধারণত একটি join table বা bridge table ব্যবহার করে ম্যাপ করা হয়।

Example: Many-to-Many Mapping

ধরা যাক আমাদের দুটি ক্লাস Student এবং Course রয়েছে, যেখানে একেকটি Student একাধিক Course নেয় এবং একেকটি Course একাধিক Student গ্রহণ করতে পারে।

Student Class

@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany
    @JoinTable(
      name = "student_course", 
      joinColumns = @JoinColumn(name = "student_id"), 
      inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set<Course> courses;

    // Constructors, Getters, and Setters
}

Course Class

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students;

    // Constructors, Getters, and Setters
}

এখানে, @ManyToMany অ্যানোটেশন দ্বারা Student এবং Course ক্লাসের মধ্যে Many-to-Many Relationship স্থাপন করা হয়েছে। @JoinTable ব্যবহার করে একটি bridge table (student_course) তৈরি করা হয়েছে, যা student_id এবং course_id কলামগুলির মাধ্যমে সম্পর্ক স্থাপন করেছে।


4. Inheritance Mapping

Hibernate ইনহেরিটেন্স (উত্তরাধিকার) সম্পর্কেও ম্যাপিং সাপোর্ট করে। Hibernate ৩টি প্রধান ইনহেরিটেন্স স্ট্রাটেজি সমর্থন করে:

  1. Single Table Inheritance
  2. Joined Table Inheritance
  3. Table per Class Inheritance

Example: Single Table Inheritance

ধরা যাক আমাদের একটি Employee ক্লাস রয়েছে এবং এর দুটি সাবক্লাস FullTimeEmployee এবং PartTimeEmployee

Employee Class (Parent Class)

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "employee_type")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;

    // Constructors, Getters, and Setters
}

FullTimeEmployee Class (Child Class)

@Entity
@DiscriminatorValue("FullTime")
public class FullTimeEmployee extends Employee {
    private double salary;

    // Constructors, Getters, and Setters
}

PartTimeEmployee Class (Child Class)

@Entity
@DiscriminatorValue("PartTime")
public class PartTimeEmployee extends Employee {
    private double hourlyRate;

    // Constructors, Getters, and Setters
}

এখানে, Single Table Inheritance ব্যবহৃত হয়েছে, যেখানে সমস্ত Employee সম্পর্কিত তথ্য একটি সিঙ্গল টেবিলে থাকবে, তবে @DiscriminatorColumn এবং @DiscriminatorValue দ্বারা FullTimeEmployee এবং PartTimeEmployee এর মধ্যে পার্থক্য করা হয়েছে।


Hibernate এর Mapping Techniques-এর মাধ্যমে আপনি ডেটাবেসের বিভিন্ন সম্পর্ক যেমন One-to-One, One-to-Many, Many-to-Many, এবং Inheritance সহজভাবে Java objects এর সাথে ম্যাপ করতে পারেন। Hibernate আপনাকে JPA (Java Persistence API) সাপোর্ট সহ ডেটাবেসের সাথে কার্যকরভাবে ইন্টারঅ্যাক্ট করতে সহায়ক একটি শক্তিশালী ORM সমাধান প্রদান করে, যা ডেটাবেসের অপারেশনকে সহজ এবং দ্রুততর করে তোলে।

Content added By

Hibernate Mapping এর ধারণা

164
164

Hibernate Mapping হল Object-Relational Mapping (ORM) প্রযুক্তির একটি গুরুত্বপূর্ণ অংশ, যা Java অবজেক্টগুলিকে ডেটাবেস টেবিলের সাথে সম্পর্কিত করে। Hibernate, JPA (Java Persistence API) এর মাধ্যমে ডেটাবেস টেবিল এবং Java ক্লাসের মধ্যে সম্পর্ক স্থাপন করতে সহায়তা করে।

Hibernate Mapping নিশ্চিত করে যে, Java অবজেক্টের ডেটা ডেটাবেস টেবিলের সঠিক কনফিগারেশনের মাধ্যমে সংরক্ষিত হয় এবং ডেটাবেসের ডেটা Java অবজেক্টে পরিবর্তিত হয়। এই প্রক্রিয়াটি খুবই স্বয়ংক্রিয় এবং ডেটাবেসের সাথে যোগাযোগ সহজ ও মডুলার করে তোলে।


Hibernate Mapping Types

Hibernate Mapping-এর তিনটি প্রধান প্রকার রয়েছে:

  1. One-to-One Mapping
  2. One-to-Many / Many-to-One Mapping
  3. Many-to-Many Mapping

এছাড়াও, Hibernate ম্যানিপুলেশন এর জন্য Inheritance Mapping এবং Component Mapping রয়েছে, যা জটিল ডেটাবেস সম্পর্ক এবং অবজেক্ট মডেলকে আরো কার্যকরীভাবে ম্যানেজ করতে সাহায্য করে।


1. One-to-One Mapping

One-to-One Mapping হল এমন একটি সম্পর্ক যেখানে একটি টেবিলের একটি রেকর্ড অন্য একটি টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত থাকে। Hibernate-এ এটি কিভাবে ম্যানেজ করা যায় তা নিচে দেখানো হয়েছে।

One-to-One Mapping Example

ধরা যাক, আমাদের দুটি ক্লাস আছে: Person এবং Passport। একটি Person এর একটি একক Passport থাকতে পারে।

Java Classes

@Entity
@Table(name = "person")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;
    
    @OneToOne
    @JoinColumn(name = "passport_id")
    private Passport passport;

    // Getters and Setters
}

@Entity
@Table(name = "passport")
public class Passport {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String passportNumber;

    // Getters and Setters
}

এখানে, @OneToOne অ্যানোটেশনটি বলে দেয় যে Person এবং Passport টেবিলগুলির মধ্যে এক-থেকে-এক সম্পর্ক রয়েছে। @JoinColumn দ্বারা, আমরা passport_id কলামকে Person টেবিলের সাথে যুক্ত করি।


2. One-to-Many / Many-to-One Mapping

One-to-Many এবং Many-to-One সম্পর্ক একে অপরের বিপরীত। একটি One-to-Many সম্পর্কের মধ্যে একটি টেবিলের একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত থাকতে পারে, এবং Many-to-One সম্পর্কের মধ্যে অনেক রেকর্ড একটি একক রেকর্ডের সাথে সম্পর্কিত থাকতে পারে।

One-to-Many Mapping Example

ধরা যাক, আমাদের Department এবং Employee টেবিল রয়েছে, যেখানে একটি Department এর অনেক Employee থাকতে পারে।

@Entity
@Table(name = "department")
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;

    @OneToMany(mappedBy = "department")
    private Set<Employee> employees;

    // Getters and Setters
}

@Entity
@Table(name = "employee")
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department;

    // Getters and Setters
}

এখানে, Department টেবিলের একটি রেকর্ড অনেক Employee রেকর্ডের সাথে সম্পর্কিত থাকতে পারে। mappedBy অ্যাট্রিবিউট দ্বারা, Hibernate জানে যে department ক্লাসের মধ্যে সম্পর্কটি Employee ক্লাসের মধ্যে বিদ্যমান।


3. Many-to-Many Mapping

Many-to-Many Mapping হল এমন একটি সম্পর্ক যেখানে একটি টেবিলের একাধিক রেকর্ড অন্য একটি টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। Hibernate-এ এই সম্পর্কের জন্য একটি junction table বা association table প্রয়োজন হয়, যা দুটি টেবিলের মধ্যে সম্পর্ক রাখে।

Many-to-Many Mapping Example

ধরা যাক, আমাদের দুটি ক্লাস রয়েছে: Student এবং Course, এবং একেকটি Student একাধিক Course গ্রহণ করতে পারে এবং একেকটি Course অনেক Student-এর জন্য হতে পারে।

@Entity
@Table(name = "student")
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;

    @ManyToMany
    @JoinTable(
      name = "student_course", 
      joinColumns = @JoinColumn(name = "student_id"), 
      inverseJoinColumns = @JoinColumn(name = "course_id"))
    private Set<Course> courses;

    // Getters and Setters
}

@Entity
@Table(name = "course")
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    private String name;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students;

    // Getters and Setters
}

এখানে, Student এবং Course টেবিলের মধ্যে একটি Many-to-Many সম্পর্ক প্রতিষ্ঠিত হয়েছে। @JoinTable অ্যানোটেশনটি একটি junction table (student_course) তৈরি করে, যা student_id এবং course_id সহ সম্পর্ক রাখে।


4. Inheritance Mapping

Hibernate ইনহেরিটেন্স ম্যাপিং দ্বারা এক ক্লাসের ইনহেরিটেড বৈশিষ্ট্যগুলিকে অন্য ক্লাসে মানিয়ে নেয়। Hibernate এ তিনটি ইনহেরিটেন্স ম্যাপিং কৌশল রয়েছে:

  • Single Table Inheritance
  • Joined Table Inheritance
  • Table Per Class Inheritance

Single Table Inheritance Example

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "vehicle_type", discriminatorType = DiscriminatorType.STRING)
public class Vehicle {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    // Getters and Setters
}

@Entity
@DiscriminatorValue("car")
public class Car extends Vehicle {
    private int numberOfDoors;

    // Getters and Setters
}

@Entity
@DiscriminatorValue("bike")
public class Bike extends Vehicle {
    private boolean hasPedals;

    // Getters and Setters
}

এখানে, Vehicle ক্লাসের সকল ইনহেরিটেড ক্লাস (Car এবং Bike) একই টেবিলের মধ্যে সংরক্ষিত হবে।


5. Component Mapping (Embedded Objects)

Hibernate-এ component mapping ব্যবহার করে আপনি Java অবজেক্টের উপাদানগুলিকে আরেকটি অবজেক্টে অন্তর্ভুক্ত করতে পারেন। এটি @Embeddable এবং @Embedded অ্যানোটেশন ব্যবহার করে করা হয়।

@Embeddable
public class Address {
    private String street;
    private String city;

    // Getters and Setters
}

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    
    @Embedded
    private Address address;

    // Getters and Setters
}

এখানে, Address ক্লাসটি Employee ক্লাসে অন্তর্ভুক্ত করা হয়েছে, যা component mapping হিসেবে কাজ করে।


Hibernate Mapping-এর মাধ্যমে আপনি আপনার Java অবজেক্ট এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক সহজেই স্থাপন করতে পারেন। Hibernate ORM আপনাকে বিভিন্ন ধরনের সম্পর্ক One-to-One, One-to-Many, Many-to-Many, Inheritance Mapping, এবং Component Mapping প্রদান করে, যা ডেটাবেস অপারেশন এবং ডেটা ম্যানেজমেন্টকে আরও সহজ এবং কার্যকরী করে তোলে।

  • One-to-One: এক টেবিলের এক রেকর্ডের সাথে অন্য টেবিলের এক রেকর্ডের সম্পর্ক।
  • One-to-Many / Many-to-One: এক টেবিলের এক রেকর্ডের সাথে অনেক রেকর্ডের সম্পর্ক।
  • Many-to-Many: এক টেবিলের অনেক রেকর্ডের সাথে অন্য টেবিলের অনেক রেকর্ডের সম্পর্ক।
  • Inheritance Mapping: একাধিক ক্লাসের মধ্যে ইনহেরিটেড বৈশিষ্ট্যগুলির সম্পর্ক।
  • Component Mapping: অবজেক্টের উপাদানগুলির মধ্যে সম্পর্ক স্থাপন।
Content added By

XML Mapping এবং Annotations এর ব্যবহার

109
109

Hibernate একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক, যা জাভা ক্লাসের সাথে রিলেশনাল ডাটাবেসের টেবিলগুলো ম্যাপিং করতে সাহায্য করে। Hibernate ডেটা ম্যানিপুলেশন করার জন্য XML Mapping এবং Annotations দুটি প্রধান পদ্ধতি ব্যবহার করে। এ দুটি পদ্ধতি ডাটাবেসের টেবিলের সাথে ক্লাসের সম্পর্ক স্থাপন করে।

1. XML Mapping

Hibernate-এ XML Mapping হল একটি পদ্ধতি যেখানে ক্লাস এবং টেবিলের মধ্যে সম্পর্ক XML Configuration ফাইলে দেওয়া হয়। এই পদ্ধতিতে, আপনি ক্লাসের fields এবং টেবিলের columns এর মধ্যে সম্পর্ক তৈরী করেন।

XML Mapping উদাহরণ:

Step 1: Hibernate Configuration (hibernate.cfg.xml)

এটি হল Hibernate এর কনফিগারেশন ফাইল যেখানে ডাটাবেসের সংযোগ তথ্য এবং মডেল ক্লাসগুলির mapping দেওয়া থাকে।

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- JDBC Database connection settings -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>

        <!-- JDBC connection pool settings -->
        <property name="hibernate.c3p0.min_size">5</property>
        <property name="hibernate.c3p0.max_size">20</property>
        <property name="hibernate.c3p0.timeout">300</property>
        <property name="hibernate.c3p0.max_statements">50</property>

        <!-- Specify the dialect -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="hibernate.current_session_context_class">thread</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="hibernate.show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- Mention annotated class -->
        <mapping resource="com/example/hibernate/MyEntity.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Step 2: Entity Class Mapping (MyEntity.hbm.xml)

এটি XML ফাইল যা Java ক্লাস এবং ডাটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করে।

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <class name="com.example.hibernate.MyEntity" table="MY_ENTITY">
        <id name="id" column="ID">
            <generator class="increment"/>
        </id>
        <property name="name" column="NAME"/>
    </class>
</hibernate-mapping>

এখানে, MyEntity ক্লাসটি MY_ENTITY টেবিলের সাথে ম্যাপ করা হয়েছে। id ফিল্ডটি টেবিলের ID কলামের সাথে সম্পর্কিত, এবং name ফিল্ডটি NAME কলামের সাথে সম্পর্কিত।


2. Annotations Based Mapping

Hibernate Annotations ব্যবহার করে ক্লাস এবং টেবিলের মধ্যে সম্পর্ক স্থাপন করা আরও সহজ এবং কম কনফিগারেশন সহকারে করা যায়। Hibernate 3.5 এর পর থেকে JPA (Java Persistence API) অ্যানোটেশনগুলি ব্যবহার করা যায়, যা ORM সমর্থন করে এবং এটি ডাটাবেস টেবিলের সাথে মডেল ক্লাসগুলির সম্পর্ক সরাসরি তৈরি করতে সাহায্য করে।

Annotations Based Mapping উদাহরণ:

Step 1: Entity Class (Using Annotations)

এখানে আমরা JPA Annotations ব্যবহার করে Hibernate মডেল ক্লাস তৈরি করছি।

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    private String name;

    // Getter and Setter methods

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

এখানে:

  • @Entity: এই অ্যানোটেশনটি নির্দেশ করে যে এই ক্লাসটি একটি JPA Entity, যা ডাটাবেস টেবিলের সাথে ম্যাপ হবে।
  • @Id: এটি ডাটাবেস টেবিলের প্রাইমারি কী ফিল্ড নির্দেশ করে।
  • @GeneratedValue: এই অ্যানোটেশনটি প্রাইমারি কী ফিল্ডের জন্য ভ্যালু সৃষ্টির কৌশল নির্ধারণ করে।

Step 2: Hibernate Configuration (hibernate.cfg.xml)

এটি আগের মতই, যেখানে Hibernate কনফিগারেশন দেওয়া থাকবে।

<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- JDBC and Hibernate Configuration Properties -->
        <property name="hibernate.dialect">org.hibernate.dialect.H2Dialect</property>
        <property name="hibernate.connection.driver_class">org.h2.Driver</property>
        <property name="hibernate.connection.url">jdbc:h2:mem:test;DB_CLOSE_DELAY=-1</property>
        <property name="hibernate.connection.username">sa</property>
        <property name="hibernate.connection.password"></property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!-- Mention the annotated class -->
        <mapping class="com.example.hibernate.MyEntity"/>
    </session-factory>
</hibernate-configuration>

এখানে, <mapping class="com.example.hibernate.MyEntity"/> এর মাধ্যমে MyEntity ক্লাসটি Hibernate কনফিগারেশনে উল্লেখ করা হয়েছে।


XML Mapping vs Annotations Based Mapping

FeatureXML MappingAnnotations Based Mapping
Complexityআরও বেশি কনফিগারেশন প্রয়োজনকম কনফিগারেশন এবং ক্লাসে অ্যানোটেশন ব্যবহার করা সহজ
Ease of Useবেশি কনফিগারেশন ফাইল প্রয়োজনডিরেক্ট ক্লাসে অ্যানোটেশন ব্যবহার করা সহজ
Flexibilityআরও নমনীয় কনফিগারেশন প্রদান করেঅ্যানোটেশনগুলি সহজ ও সোজা, তবে কিছু ক্ষেত্রে সীমিত হতে পারে
Maintainabilityআলাদা XML ফাইল তৈরি করতে হয়কোডের সাথে একই ফাইলে সবকিছু থাকে
Performanceপ্রায় সমান কার্যক্ষমতাখুব সামান্য পারফরম্যান্স পার্থক্য
Learning Curveকিছুটা সময় নেয় অভ্যস্ত হতেদ্রুত শিখতে এবং ব্যবহার করতে সুবিধাজনক

Hibernate ডাটাবেসের সাথে কাজ করার জন্য XML Mapping এবং Annotations Based Mapping দুটি গুরুত্বপূর্ণ পদ্ধতি প্রদান করে।

  • XML Mapping পদ্ধতি অধিক কনফিগারেশন এবং নমনীয়তা প্রদান করে, তবে এতে আরও বেশি কাজের প্রয়োজন।
  • Annotations Based Mapping জাভা ক্লাসে সরাসরি অ্যানোটেশন ব্যবহার করে কোডকে পরিষ্কার এবং কমপ্যাক্ট রাখে।

আপনার প্রোজেক্টের প্রয়োজন এবং ব্যবহারের সহজতা অনুযায়ী আপনি যেকোনো একটি পদ্ধতি নির্বাচন করতে পারেন।

Content added By

One-to-One, One-to-Many, Many-to-One, Many-to-Many Mapping

219
219

Hibernate হল একটি জনপ্রিয় ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা ডাটাবেস টেবিলের মধ্যে অবজেক্ট সম্পর্ক (relationships) তৈরি করতে সহায়ক। Hibernate ব্যবহার করে বিভিন্ন সম্পর্ক (relationship) যেমন One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many ম্যাপিং করা যেতে পারে।

এখানে Hibernate-এ One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের ম্যাপিংয়ের বিস্তারিত আলোচনা করা হলো।


1. One-to-One Mapping

One-to-One Mapping এমন একটি সম্পর্ক যেখানে একটি অবজেক্ট অন্য একটি অবজেক্টের সাথে একে অপরের সাথে সম্পর্কিত থাকে। অর্থাৎ, একে অপরের সাথে এক একক সম্পর্ক থাকে।

Example: Employee এবং Address ক্লাসের মধ্যে একে অপরের সাথে সম্পর্ক।

  • Entity Classes:
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @OneToOne
    @JoinColumn(name = "address_id")
    private Address address; // Employee has one Address

    // Getters and setters
}

@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String street;
    private String city;

    @OneToOne(mappedBy = "address")
    private Employee employee; // Address belongs to one Employee

    // Getters and setters
}
  • Explanation:
    • @OneToOne: এটি সম্পর্কের ধরন নির্ধারণ করে, যেখানে একটি Employee একটিমাত্র Address এর সাথে সম্পর্কিত।
    • @JoinColumn: এটি ডাটাবেসের সারণীতে একটিমাত্র কলাম তৈরি করে যা এই সম্পর্কটিকে মান্য করে।

2. One-to-Many Mapping

One-to-Many Mapping এমন একটি সম্পর্ক যেখানে একটি অবজেক্ট একাধিক অবজেক্টের সাথে সম্পর্কিত থাকে। এক্ষেত্রে, একটি Parent অবজেক্ট অনেকগুলো Child অবজেক্টের সাথে সম্পর্কিত থাকে।

Example: Department এবং Employee ক্লাসের মধ্যে সম্পর্ক, যেখানে একটিমাত্র Department অনেক Employee ধারণ করে।

  • Entity Classes:
@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @OneToMany(mappedBy = "department")
    private Set<Employee> employees; // A department has many employees

    // Getters and setters
}

@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department; // An employee belongs to one department

    // Getters and setters
}
  • Explanation:
    • @OneToMany: এটি নির্ধারণ করে যে একটি Department একাধিক Employee ধারণ করতে পারে।
    • mappedBy: এটি Employee ক্লাসের department ফিল্ডের মাধ্যমে সম্পর্কটি নির্দেশ করে।
    • @ManyToOne: এটি Employee কে Department এর সাথে সম্পর্কিত করে।

3. Many-to-One Mapping

Many-to-One Mapping একটি সম্পর্ক যেখানে একাধিক অবজেক্ট একটি একক অবজেক্টের সাথে সম্পর্কিত থাকে। এটি One-to-Many সম্পর্কের বিপরীত।

Example: Employee এবং Department ক্লাসের মধ্যে সম্পর্ক, যেখানে একাধিক Employee একটি Department এর সাথে সম্পর্কিত।

  • Entity Classes:
@Entity
public class Employee {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @ManyToOne
    @JoinColumn(name = "department_id")
    private Department department; // Multiple employees belong to one department

    // Getters and setters
}

@Entity
public class Department {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    // Getters and setters
}
  • Explanation:
    • @ManyToOne: এটি Employee এর একাধিক ইনস্ট্যান্সকে Department এর একটি ইনস্ট্যান্সের সাথে সম্পর্কিত করে।
    • @JoinColumn: এটি সম্পর্কিত ডাটাবেস টেবিলের কলামটি নির্দেশ করে।

4. Many-to-Many Mapping

Many-to-Many Mapping একটি সম্পর্ক যেখানে একাধিক অবজেক্ট একাধিক অবজেক্টের সাথে সম্পর্কিত থাকে। অর্থাৎ, একটি Student একাধিক Course এর সাথে এবং একটি Course একাধিক Student এর সাথে সম্পর্কিত থাকে।

Example: Student এবং Course ক্লাসের মধ্যে সম্পর্ক, যেখানে একাধিক Student একাধিক Course গ্রহণ করতে পারে।

  • Entity Classes:
@Entity
public class Student {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course",
        joinColumns = @JoinColumn(name = "student_id"),
        inverseJoinColumns = @JoinColumn(name = "course_id")
    )
    private Set<Course> courses; // A student can enroll in multiple courses

    // Getters and setters
}

@Entity
public class Course {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String name;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students; // A course can have multiple students

    // Getters and setters
}
  • Explanation:
    • @ManyToMany: এটি একটি সম্পর্ক নির্দেশ করে যেখানে একাধিক Student একাধিক Course এর সাথে সম্পর্কিত।
    • @JoinTable: এটি student_course নামক এক মাধ্যমিক টেবিল তৈরি করে, যেখানে দুটি টেবিলের (Student এবং Course) সম্পর্ক রক্ষা করা হয়।
    • mappedBy: এটি Course ক্লাসের মধ্যে সম্পর্ক নির্দেশ করে।

Hibernate-এ One-to-One, One-to-Many, Many-to-One, এবং Many-to-Many সম্পর্কের ম্যাপিং বেশ সহজ এবং শক্তিশালী। বিভিন্ন সম্পর্কের মধ্যে ডিপেনডেন্সি ম্যানেজমেন্ট করার জন্য Hibernate এর অ্যানোটেশন ব্যবহার করা হয়, যেমন @OneToMany, @ManyToOne, @OneToOne, এবং @ManyToMany

এই ম্যাপিংগুলি ব্যবহার করে আপনি জাভা অবজেক্ট এবং ডাটাবেস টেবিলগুলোর মধ্যে সম্পর্ক তৈরি করতে পারবেন এবং আপনার অ্যাপ্লিকেশনে ডেটাবেস ইন্টারঅ্যাকশনের কার্যক্ষমতা এবং সুবিধা বৃদ্ধি করতে পারবেন।

Content added By

Primary Key এবং Foreign Key Mapping

145
145

Hibernate একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশনে ডেটাবেসের টেবিলগুলোর সাথে object-oriented কনসেপ্টের মধ্যে ম্যাপিং করে। Hibernate ডেটাবেসের Primary Key এবং Foreign Key সম্পর্কগুলিকে সহজে ম্যানেজ করতে সাহায্য করে, এবং আপনি Java objects এবং Relational database tables এর মধ্যে সম্পর্কগুলো সঠিকভাবে ম্যাপ করতে পারেন।

এখানে Primary Key এবং Foreign Key Mapping এর জন্য Hibernate এর ব্যবহৃত কৌশলগুলো এবং Annotations এবং XML কনফিগারেশনে Mapping কিভাবে করা যায় তা বিস্তারিতভাবে আলোচনা করা হবে।


1. Primary Key Mapping in Hibernate

Primary Key হল একটি টেবিলের একটি ফিল্ড যেটি প্রতিটি রেকর্ডকে ইউনিকভাবে চিহ্নিত করে। Hibernate এ, @Id অ্যানোটেশন বা <id> XML ট্যাগ ব্যবহার করে একটি ক্লাসের প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করা হয়।

Primary Key Mapping Using Annotations:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;

@Entity
public class Student {
    @Id  // Primary Key annotation
    @GeneratedValue(strategy = GenerationType.IDENTITY)  // Auto-generated primary key
    private int id;
    private String name;
    private String course;

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }
}
  • @Id: এই অ্যানোটেশনটি ক্লাসের প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করে।
  • @GeneratedValue: এই অ্যানোটেশনটি জানিয়ে দেয় যে, Primary Key টি অটোমেটিক্যালি জেনারেট হবে (যেমন, IDENTITY, SEQUENCE বা AUTO স্ট্র্যাটেজি অনুযায়ী)।

Primary Key Mapping Using XML Configuration:

XML কনফিগারেশনেও Primary Key ম্যানেজ করা সম্ভব। এখানে <id> ট্যাগ ব্যবহার করে Primary Key ম্যাপ করা হয়।

<class name="Student" table="student">
    <id name="id" column="id">
        <generator class="identity" />  <!-- Auto-generated Primary Key -->
    </id>
    <property name="name" column="name"/>
    <property name="course" column="course"/>
</class>
  • <id>: এটি ক্লাসের প্রপার্টিকে Primary Key হিসেবে চিহ্নিত করে এবং <generator> ট্যাগের মাধ্যমে কীভাবে এটি জেনারেট হবে তা নির্ধারণ করে।

2. Foreign Key Mapping in Hibernate

Foreign Key হল একটি কলাম যা অন্য একটি টেবিলের Primary Key-এর সাথে সম্পর্কিত। Hibernate এ Foreign Key Mapping করার জন্য বিভিন্ন সম্পর্ক তৈরি করা হয়, যেমন One-to-One, One-to-Many, এবং Many-to-Many। এখানে কিছু সাধারণ Foreign Key Mapping এর উদাহরণ দেওয়া হলো।

One-to-One Relationship Using Foreign Key:

একটি One-to-One সম্পর্ক তৈরি করার জন্য @OneToOne এবং @JoinColumn অ্যানোটেশন ব্যবহার করা হয়। এখানে Foreign Key হিসাবে student_id কে চিহ্নিত করা হয়েছে।

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToOne;
import javax.persistence.JoinColumn;

@Entity
public class Student {
    @Id
    private int id;
    private String name;

    @OneToOne
    @JoinColumn(name = "address_id")  // Foreign Key Mapping
    private Address address;

    // Getters and Setters
}
@Entity
public class Address {
    @Id
    private int id;
    private String city;

    // Getters and Setters
}
  • @OneToOne: এটি One-to-One সম্পর্ক নির্দেশ করে।
  • @JoinColumn: এটি সম্পর্কিত টেবিলের জন্য Foreign Key কলাম নির্ধারণ করে।

One-to-Many Relationship Using Foreign Key:

একটি One-to-Many সম্পর্কের মধ্যে, একটি প্রাথমিক টেবিলের একাধিক রেকর্ড অন্য টেবিলের এক রেকর্ডের সাথে সম্পর্কিত থাকে। @OneToMany এবং @ManyToOne অ্যানোটেশন ব্যবহার করা হয়, এবং Foreign Key টেবিলের মধ্যে student_id হিসেবে মানানসই হয়।

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.OneToMany;

@Entity
public class Student {
    @Id
    private int id;
    private String name;

    @OneToMany(mappedBy = "student")
    private Set<Course> courses;

    // Getters and Setters
}
@Entity
public class Course {
    @Id
    private int id;
    private String courseName;

    @ManyToOne
    @JoinColumn(name = "student_id")  // Foreign Key mapping
    private Student student;

    // Getters and Setters
}
  • @OneToMany(mappedBy = "student"): mappedBy অ্যাট্রিবিউটটি জানায় যে, Course টেবিলের মধ্যে student হল Foreign Key
  • @ManyToOne: এটি Many-to-One সম্পর্ক নির্দেশ করে, এবং @JoinColumn Foreign Key কলামকে চিহ্নিত করে।

Many-to-Many Relationship Using Foreign Key:

একটি Many-to-Many সম্পর্কের মধ্যে, একটি টেবিলের একাধিক রেকর্ড অন্য টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত থাকে। @ManyToMany এবং @JoinTable অ্যানোটেশন ব্যবহার করা হয়।

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.JoinTable;
import javax.persistence.JoinColumn;

@Entity
public class Student {
    @Id
    private int id;
    private String name;

    @ManyToMany
    @JoinTable(
        name = "student_course",  // Join Table
        joinColumns = @JoinColumn(name = "student_id"),  // Foreign Key in Student table
        inverseJoinColumns = @JoinColumn(name = "course_id")  // Foreign Key in Course table
    )
    private Set<Course> courses;

    // Getters and Setters
}
@Entity
public class Course {
    @Id
    private int id;
    private String courseName;

    @ManyToMany(mappedBy = "courses")
    private Set<Student> students;

    // Getters and Setters
}
  • @ManyToMany: এটি Many-to-Many সম্পর্ক নির্দেশ করে।
  • @JoinTable: এটি দুটি টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য একটি join table নির্ধারণ করে।
  • @JoinColumn: এটি Foreign Key কলাম তৈরি করে।

3. Key Differences Between Primary Key and Foreign Key Mapping in Hibernate

ফিচারPrimary Key MappingForeign Key Mapping
এন্টারিটি সম্পর্কএকটি টেবিলের প্রতিটি রেকর্ডকে ইউনিকভাবে চিহ্নিত করে।একটি টেবিল অন্য টেবিলের সাথে সম্পর্কিত থাকে।
অ্যানোটেশন ব্যবহার@Id এবং @GeneratedValue@OneToOne, @ManyToOne, @OneToMany, @ManyToMany
ডেটাবেস টেবিলের মধ্যে সম্পর্কএকটি টেবিলের মধ্যে একক বা ইউনিক কলাম।টেবিলের মধ্যে সম্পর্ক তৈরি করার জন্য Foreign Key ব্যবহার।
সর্বাধিক ব্যবহৃত সম্পর্কএকে অপরের মধ্যে সম্পর্কিত রেকর্ডগুলির সুনির্দিষ্ট চিহ্নিতকরণএকটি টেবিলের রেকর্ড অন্য টেবিলের সাথে সম্পর্কিত হয়।

Hibernate-এ Primary Key এবং Foreign Key Mapping গুরুত্বপূর্ণ ভূমিকা পালন করে ডেটাবেস সম্পর্ক তৈরি করতে। Primary Key হল একটি টেবিলের প্রতি রেকর্ডের জন্য ইউনিক চিহ্ন, এবং Foreign Key ব্যবহার করে আপনি একাধিক টেবিলের মধ্যে সম্পর্ক তৈরি করতে পারেন। Hibernate এ আপনি Annotations এবং XML কনফিগারেশন ব্যবহারের মাধ্যমে সহজেই এই সম্পর্কগুলো ম্যানেজ করতে পারেন।

Content added By
Promotion