Entity Mapping হল জাভা ক্লাস এবং ডাটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করার একটি প্রক্রিয়া। Spring ORM Hibernate বা JPA ব্যবহার করে Entity Mapping সহজতর করে।
Hibernate বা JPA annotations ব্যবহার করে এই ম্যাপিং করা হয়। Entity Mapping মূলত টেবিলের কাঠামো এবং জাভা ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করে।
@Entity
একটি জাভা ক্লাসকে Hibernate বা JPA-এর Entity হিসাবে চিহ্নিত করে। এটি সেই ক্লাসকে নির্দেশ করে, যেটি ডাটাবেস টেবিলের সাথে ম্যাপ করা হবে।
@Table
অ্যানোটেশনটি ডাটাবেস টেবিলের নাম নির্ধারণ করতে ব্যবহৃত হয়। যদি এটি ব্যবহার না করা হয়, তবে ডিফল্টভাবে ক্লাসের নাম টেবিলের নাম হিসাবে নেওয়া হয়।
@Id
অ্যানোটেশনটি Primary Key নির্ধারণের জন্য ব্যবহৃত হয়।
@GeneratedValue
অ্যানোটেশনটি Primary Key-এর মান অটোমেটিক জেনারেট করতে ব্যবহৃত হয়।
@Column
ডাটাবেস টেবিলের একটি নির্দিষ্ট কলামের সাথে একটি ফিল্ড ম্যাপ করে। এটি কলামের নাম, দৈর্ঘ্য, এবং অন্যান্য বৈশিষ্ট্য নির্ধারণ করতে ব্যবহৃত হয়।
নিচে একটি উদাহরণ দেওয়া হলো, যেখানে একটি User
ক্লাস ডাটাবেস টেবিলের সাথে ম্যাপ করা হয়েছে:
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "first_name", nullable = false, length = 50)
private String firstName;
@Column(name = "last_name", nullable = false, length = 50)
private String lastName;
@Column(name = "email", unique = true, nullable = false)
private String email;
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এক টেবিলের একটি রেকর্ড অন্য টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত হলে @OneToOne
ব্যবহার করা হয়।
@OneToOne
@JoinColumn(name = "profile_id")
private Profile profile;
এক টেবিলের একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত হলে @OneToMany
ব্যবহার করা হয়।
@OneToMany(mappedBy = "user")
private List<Order> orders;
অনেক টেবিলের রেকর্ড একটি টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত হলে @ManyToOne
ব্যবহার করা হয়।
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
অনেক রেকর্ড একাধিক রেকর্ডের সাথে সম্পর্কিত হলে @ManyToMany
ব্যবহার করা হয়।
@ManyToMany
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;
Entity ক্লাস তৈরি করে উপযুক্ত অ্যানোটেশন দিয়ে প্রতিটি ফিল্ডকে ডাটাবেস টেবিলের কলামের সাথে ম্যাপ করতে হবে।
Hibernate বা JPA-কে টেবিল তৈরি করার অনুমতি দেওয়া বা বিদ্যমান টেবিল ব্যবহারের জন্য প্রয়োজনীয় সেটিং নিশ্চিত করতে হবে।
Spring ORM Entity Mapping ব্যবহার করে ডাটাবেস টেবিল এবং জাভা ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করা যায়। এর ফলে অ্যাপ্লিকেশনের ডাটাবেস অপারেশন সহজতর হয় এবং কোড সংরক্ষণশীল ও সুনির্দিষ্ট থাকে।
Entity Mapping হল Spring ORM (বা অন্য ORM) ব্যবহার করে ডাটাবেসের টেবিল এবং জাভা ক্লাসের মধ্যে একটি সংযোগ স্থাপন করার পদ্ধতি। ORM (Object-Relational Mapping) টুল যেমন Hibernate বা JPA এর মাধ্যমে টেবিলের রো-কলাম এবং জাভা অবজেক্টের প্রোপার্টির মধ্যে ম্যাপিং তৈরি করা হয়। এর ফলে ডেভেলপাররা SQL লিখে ডাটাবেস অ্যাক্সেস না করেই জাভা অবজেক্ট ব্যবহার করে ডাটাবেস অপারেশন সম্পন্ন করতে পারে।
Spring ORM ব্যবহার করলে Entity Mapping সহজ ও সুসংহত হয়।
@Entity
অ্যানোটেশন ব্যবহার করে একটি জাভা ক্লাসকে ডাটাবেস টেবিল হিসেবে ঘোষণা করা হয়।
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private int id;
private String name;
private String email;
// Getter এবং Setter মেথড
}
@Table
অ্যানোটেশন ব্যবহার করে টেবিলের নাম কাস্টমাইজ করা যায়।
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
@Entity
@Table(name = "users")
public class User {
// ফিল্ড ডেফিনেশন
}
@Id
ফিল্ডটি টেবিলের প্রাইমারি কী নির্দেশ করে।@GeneratedValue
দিয়ে প্রাইমারি কী-এর জেনারেশন স্ট্র্যাটেজি নির্ধারণ করা যায়।
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// Getter এবং Setter মেথড
}
@Column
দিয়ে একটি ফিল্ডের ডাটাবেস কলামের নাম এবং বৈশিষ্ট্য নির্ধারণ করা যায়।
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class User {
@Id
private int id;
@Column(name = "user_name", nullable = false)
private String name;
private String email;
}
@Entity
অ্যানোটেশনের মাধ্যমে একটি টেবিলের প্রতিনিধিত্ব করে।@Column
বা ডিফল্টভাবে কলামের সঙ্গে ম্যাপ হয়।@Id
অ্যানোটেশনের মাধ্যমে নির্ধারণ হয়।@OneToOne
, @OneToMany
, এবং @ManyToMany
ব্যবহার করা হয়।import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Column;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
@Column(name = "product_name", nullable = false)
private String name;
private double price;
// Getter এবং Setter
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 double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
Entity Mapping এর মাধ্যমে জাভা অ্যাপ্লিকেশনে ডাটাবেস ম্যানিপুলেশন আরও কার্যকর হয়। Spring ORM ব্যবহার করলে Entity Mapping সহজে এবং দ্রুত বাস্তবায়ন করা যায়।
Spring ORM-এ @Table
এবং @Column
অ্যানোটেশন ব্যবহার করে ডাটাবেস টেবিলের সঙ্গে জাভা ক্লাসের ম্যাপিং করা হয়। এগুলো JPA (Java Persistence API) থেকে আসে এবং Hibernate বা JPA প্রোভাইডার ব্যবহারে খুবই কার্যকরী।
@Table
এবং @Column
কী?@Table
: একটি জাভা ক্লাসকে ডাটাবেস টেবিলের সঙ্গে সংযুক্ত (Map) করতে ব্যবহৃত হয়। এটি টেবিলের নাম ও অন্যান্য বৈশিষ্ট্য নির্ধারণ করে।@Column
: ডাটাবেস টেবিলের নির্দিষ্ট একটি কলামের সঙ্গে জাভা ক্লাসের একটি ফিল্ড সংযুক্ত করতে ব্যবহৃত হয়।@Table
এবং @Column
এর ব্যবহারimport jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Column;
@Entity
@Table(name = "employees")
public class Employee {
@Id
@Column(name = "employee_id", nullable = false)
private Long id;
@Column(name = "employee_name", length = 100, nullable = false)
private String name;
@Column(name = "department")
private String department;
@Column(name = "salary", columnDefinition = "DECIMAL(10, 2)")
private Double salary;
// Getters and Setters
}
@Table
এবং @Column
এর ব্যবহার ব্যাখ্যা@Table
এর বৈশিষ্ট্যname
: ডাটাবেস টেবিলের নাম নির্ধারণ করে।schema
: স্কিমা স্পেসিফাই করতে ব্যবহৃত হয় (যদি প্রয়োজন হয়)।catalog
: ডাটাবেস ক্যাটালগ নির্ধারণ করতে ব্যবহৃত হয়।উদাহরণ:
@Table(name = "employees", schema = "hr")
@Column
এর বৈশিষ্ট্যname
: ডাটাবেস কলামের নাম নির্ধারণ করে।length
: স্ট্রিং টাইপের কলামের দৈর্ঘ্য নির্ধারণ করে।nullable
: কলামে NULL
অনুমতি দেওয়া হবে কি না।unique
: কলামটিকে ইউনিক কনস্ট্রেইন্ট দেয়।columnDefinition
: কলামের ডাটাটাইপ নির্ধারণ করে।উদাহরণ:
@Column(name = "employee_name", length = 100, nullable = false, unique = true)
@Entity
ব্যবহার করে ক্লাসকে Entity হিসেবে চিহ্নিত করা।@Table
ব্যবহার করে ডাটাবেস টেবিলের নাম কনফিগার করা।@Column
ব্যবহার করে প্রতিটি ফিল্ডকে কলামের সঙ্গে সংযুক্ত করা।@Table
এবং @Column
সহ একটি পূর্ণাঙ্গ Entityimport jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import jakarta.persistence.Column;
@Entity
@Table(name = "products")
public class Product {
@Id
@Column(name = "product_id")
private Long id;
@Column(name = "product_name", nullable = false, length = 255)
private String name;
@Column(name = "price", columnDefinition = "DECIMAL(10, 2)")
private Double price;
@Column(name = "description", length = 500)
private String description;
// Getters and Setters
}
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class ProductService {
@Autowired
private ProductRepository productRepository;
public List<Product> getAllProducts() {
return productRepository.findAll();
}
public Product saveProduct(Product product) {
return productRepository.save(product);
}
}
@Table
এবং @Column
এর মাধ্যমে টেবিল এবং কলাম ম্যাপিং অত্যন্ত সহজ হয়, যা ডাটাবেসের সঙ্গে জাভা ক্লাসের সঠিক সংযোগ নিশ্চিত করে।
স্প্রিং ওআরএম ব্যবহার করে Java Persistence API (JPA) এবং Hibernate এর মাধ্যমে ডাটাবেসে সম্পর্ক (Relationships) মডেল করা সম্ভব। এখানে One-to-One, One-to-Many, এবং Many-to-Many সম্পর্ক ব্যাখ্যা করা হলো।
একটি টেবিলের একটি রেকর্ড আরেকটি টেবিলের মাত্র একটি রেকর্ডের সাথে সম্পর্কিত হলে এটি One-to-One সম্পর্ক।
প্রতিটি ব্যবহারকারীর (User) একটি অ্যাড্রেস (Address) থাকতে পারে।
import jakarta.persistence.*;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id", referencedColumnName = "id")
private Address address;
// Getters and Setters
}
@Entity
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String street;
private String city;
// Getters and Setters
}
@OneToOne
: সম্পর্ক নির্দেশ করে।@JoinColumn
: address_id
কলাম দিয়ে দুটি টেবিল লিঙ্ক করে।একটি টেবিলের একটি রেকর্ড আরেকটি টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত হলে এটি One-to-Many সম্পর্ক।
একটি ক্যাটেগরির (Category) একাধিক প্রোডাক্ট (Product) থাকতে পারে।
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Category {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToMany(mappedBy = "category", cascade = CascadeType.ALL)
private List<Product> products;
// Getters and Setters
}
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToOne
@JoinColumn(name = "category_id")
private Category category;
// Getters and Setters
}
@OneToMany
: একাধিক সম্পর্ক নির্দেশ করে।@ManyToOne
: বিপরীত সম্পর্ক নির্দেশ করে।mappedBy
: মূল সম্পর্কের ফিল্ডের নাম দেখায়।দুটি টেবিলের একাধিক রেকর্ড একে অপরের সাথে সম্পর্কিত হলে এটি Many-to-Many সম্পর্ক।
একটি শিক্ষার্থী (Student) একাধিক কোর্স (Course) নিতে পারে এবং একটি কোর্সে একাধিক শিক্ষার্থী থাকতে পারে।
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Student {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@ManyToMany
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// Getters and Setters
}
@Entity
public class Course {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String title;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// Getters and Setters
}
@ManyToMany
: সম্পর্ক নির্দেশ করে।@JoinTable
: মধ্যবর্তী টেবিলের নাম এবং কলাম নির্ধারণ করে।inverseJoinColumns
: বিপরীত দিকের টেবিলের কলাম নির্ধারণ করে।এই সম্পর্কগুলো স্প্রিং ওআরএম এবং Hibernate এর মাধ্যমে ডেটাবেস মডেলিং সহজ করে।
Entity Mapping হলো ORM (Object Relational Mapping) এর একটি গুরুত্বপূর্ণ দিক, যা ডাটাবেজ টেবিল এবং Java ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করে। Spring ORM এর মাধ্যমে Hibernate ব্যবহার করে সহজেই Entity Mapping করা যায়।
একটি Java ক্লাস সরাসরি একটি টেবিলের সঙ্গে যুক্ত থাকে।
এখানে আমরা একাধিক ধরণের Entity Mapping এর উদাহরণ দেখাবো।
একটি Java ক্লাসের সাথে একটি ডাটাবেজ টেবিলকে ম্যাপ করা হবে।
Employee.java
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Employee {
@Id
private int id;
private String name;
private String department;
// 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 getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
}
Hibernate এই Entity কে ডাটাবেজের একটি টেবিলের সাথে যুক্ত করে এবং ডাটাবেসে Employee টেবিল তৈরি করে।
একটি Entity অন্য একটি Entity এর সাথে ১:১ সম্পর্ক তৈরি করবে।
Employee.java
import jakarta.persistence.*;
@Entity
public class Employee {
@Id
private int id;
private String name;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "address_id")
private Address address;
// 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 Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
Address.java
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
@Entity
public class Address {
@Id
private int id;
private String city;
private String country;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
}
একটি Entity একাধিক Entity এর সাথে সম্পর্ক তৈরি করবে।
Department.java
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Department {
@Id
private int id;
private String name;
@OneToMany(mappedBy = "department", cascade = CascadeType.ALL)
private List<Employee> employees;
// 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 List<Employee> getEmployees() {
return employees;
}
public void setEmployees(List<Employee> employees) {
this.employees = employees;
}
}
Employee.java
import jakarta.persistence.*;
@Entity
public class Employee {
@Id
private int id;
private String name;
@ManyToOne
@JoinColumn(name = "department_id")
private Department department;
// 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 Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
দুই Entity একে অপরের সাথে অনেক থেকে অনেক সম্পর্ক তৈরি করবে।
Student.java
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Student {
@Id
private int id;
private String name;
@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
name = "student_course",
joinColumns = @JoinColumn(name = "student_id"),
inverseJoinColumns = @JoinColumn(name = "course_id")
)
private List<Course> courses;
// 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 List<Course> getCourses() {
return courses;
}
public void setCourses(List<Course> courses) {
this.courses = courses;
}
}
Course.java
import jakarta.persistence.*;
import java.util.List;
@Entity
public class Course {
@Id
private int id;
private String title;
@ManyToMany(mappedBy = "courses")
private List<Student> students;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public List<Student> getStudents() {
return students;
}
public void setStudents(List<Student> students) {
this.students = students;
}
}
এসব Entity Mapping Hibernate এবং Spring ORM ব্যবহার করে Java প্রজেক্টে কার্যকরভাবে ডাটাবেস সম্পর্ক তৈরি করতে ব্যবহৃত হয়।
Read more