Entity Mapping হল জাভা ক্লাস এবং ডাটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করার একটি প্রক্রিয়া। Spring ORM Hibernate বা JPA ব্যবহার করে Entity Mapping সহজতর করে।
Hibernate বা JPA annotations ব্যবহার করে এই ম্যাপিং করা হয়। Entity Mapping মূলত টেবিলের কাঠামো এবং জাভা ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করে।
Entity Mapping-এর জন্য গুরুত্বপূর্ণ অ্যানোটেশন
@Entity
@Entity একটি জাভা ক্লাসকে Hibernate বা JPA-এর Entity হিসাবে চিহ্নিত করে। এটি সেই ক্লাসকে নির্দেশ করে, যেটি ডাটাবেস টেবিলের সাথে ম্যাপ করা হবে।
@Table
@Table অ্যানোটেশনটি ডাটাবেস টেবিলের নাম নির্ধারণ করতে ব্যবহৃত হয়। যদি এটি ব্যবহার না করা হয়, তবে ডিফল্টভাবে ক্লাসের নাম টেবিলের নাম হিসাবে নেওয়া হয়।
@Id
@Id অ্যানোটেশনটি Primary Key নির্ধারণের জন্য ব্যবহৃত হয়।
@GeneratedValue
@GeneratedValue অ্যানোটেশনটি Primary Key-এর মান অটোমেটিক জেনারেট করতে ব্যবহৃত হয়।
@Column
@Column ডাটাবেস টেবিলের একটি নির্দিষ্ট কলামের সাথে একটি ফিল্ড ম্যাপ করে। এটি কলামের নাম, দৈর্ঘ্য, এবং অন্যান্য বৈশিষ্ট্য নির্ধারণ করতে ব্যবহৃত হয়।
Entity Mapping-এর উদাহরণ
নিচে একটি উদাহরণ দেওয়া হলো, যেখানে একটি 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;
}
}
Entity Relationships Mapping
@OneToOne
এক টেবিলের একটি রেকর্ড অন্য টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত হলে @OneToOne ব্যবহার করা হয়।
@OneToOne
@JoinColumn(name = "profile_id")
private Profile profile;
@OneToMany
এক টেবিলের একটি রেকর্ড অনেক রেকর্ডের সাথে সম্পর্কিত হলে @OneToMany ব্যবহার করা হয়।
@OneToMany(mappedBy = "user")
private List<Order> orders;
@ManyToOne
অনেক টেবিলের রেকর্ড একটি টেবিলের একটি রেকর্ডের সাথে সম্পর্কিত হলে @ManyToOne ব্যবহার করা হয়।
@ManyToOne
@JoinColumn(name = "role_id")
private Role role;
@ManyToMany
অনেক রেকর্ড একাধিক রেকর্ডের সাথে সম্পর্কিত হলে @ManyToMany ব্যবহার করা হয়।
@ManyToMany
@JoinTable(
name = "user_roles",
joinColumns = @JoinColumn(name = "user_id"),
inverseJoinColumns = @JoinColumn(name = "role_id")
)
private Set<Role> roles;
Entity Mapping-এর কাজের ধাপ
১. Entity ক্লাস তৈরি করা
Entity ক্লাস তৈরি করে উপযুক্ত অ্যানোটেশন দিয়ে প্রতিটি ফিল্ডকে ডাটাবেস টেবিলের কলামের সাথে ম্যাপ করতে হবে।
২. ডাটাবেস টেবিল কনফিগারেশন নিশ্চিত করা
Hibernate বা JPA-কে টেবিল তৈরি করার অনুমতি দেওয়া বা বিদ্যমান টেবিল ব্যবহারের জন্য প্রয়োজনীয় সেটিং নিশ্চিত করতে হবে।
উপসংহার
Spring ORM Entity Mapping ব্যবহার করে ডাটাবেস টেবিল এবং জাভা ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করা যায়। এর ফলে অ্যাপ্লিকেশনের ডাটাবেস অপারেশন সহজতর হয় এবং কোড সংরক্ষণশীল ও সুনির্দিষ্ট থাকে।
Entity Mapping হল Spring ORM (বা অন্য ORM) ব্যবহার করে ডাটাবেসের টেবিল এবং জাভা ক্লাসের মধ্যে একটি সংযোগ স্থাপন করার পদ্ধতি। ORM (Object-Relational Mapping) টুল যেমন Hibernate বা JPA এর মাধ্যমে টেবিলের রো-কলাম এবং জাভা অবজেক্টের প্রোপার্টির মধ্যে ম্যাপিং তৈরি করা হয়। এর ফলে ডেভেলপাররা SQL লিখে ডাটাবেস অ্যাক্সেস না করেই জাভা অবজেক্ট ব্যবহার করে ডাটাবেস অপারেশন সম্পন্ন করতে পারে।
Spring ORM ব্যবহার করলে Entity Mapping সহজ ও সুসংহত হয়।
Entity Mapping এর মূল উপাদান
@Entity অ্যানোটেশন
@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 অ্যানোটেশন
@Table অ্যানোটেশন ব্যবহার করে টেবিলের নাম কাস্টমাইজ করা যায়।
import jakarta.persistence.Entity;
import jakarta.persistence.Table;
@Entity
@Table(name = "users")
public class User {
// ফিল্ড ডেফিনেশন
}
@Id এবং @GeneratedValue
@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 অ্যানোটেশন
@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 Mapping এর গুরুত্বপূর্ণ বৈশিষ্ট্য
- Java Class এবং Table Mapping: জাভা ক্লাস
@Entityঅ্যানোটেশনের মাধ্যমে একটি টেবিলের প্রতিনিধিত্ব করে। - Field এবং Column Mapping: প্রতিটি ক্লাস ফিল্ড
@Columnবা ডিফল্টভাবে কলামের সঙ্গে ম্যাপ হয়। - Primary Key Definition: প্রাইমারি কী
@Idঅ্যানোটেশনের মাধ্যমে নির্ধারণ হয়। - Relationship Mapping: একাধিক টেবিলের মধ্যে সম্পর্ক নির্ধারণ করতে
@OneToOne,@OneToMany, এবং@ManyToManyব্যবহার করা হয়।
উদাহরণ: একটি Entity ক্লাস
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 এর সুবিধা
- SQL লেখার প্রয়োজনীয়তা কমায়।
- Object-Oriented Programming (OOP) এর ধারণার সঙ্গে সামঞ্জস্যপূর্ণ।
- ডাটাবেস এবং অ্যাপ্লিকেশন স্তরের মধ্যে লজিক্যাল সম্পর্ক তৈরি করে।
- ডাটাবেস মডেলের পরিবর্তন সহজ করে।
Entity Mapping এর মাধ্যমে জাভা অ্যাপ্লিকেশনে ডাটাবেস ম্যানিপুলেশন আরও কার্যকর হয়। Spring ORM ব্যবহার করলে Entity Mapping সহজে এবং দ্রুত বাস্তবায়ন করা যায়।
Spring ORM-এ @Table এবং @Column অ্যানোটেশন ব্যবহার করে ডাটাবেস টেবিলের সঙ্গে জাভা ক্লাসের ম্যাপিং করা হয়। এগুলো JPA (Java Persistence API) থেকে আসে এবং Hibernate বা JPA প্রোভাইডার ব্যবহারে খুবই কার্যকরী।
@Table এবং @Column কী?
@Table: একটি জাভা ক্লাসকে ডাটাবেস টেবিলের সঙ্গে সংযুক্ত (Map) করতে ব্যবহৃত হয়। এটি টেবিলের নাম ও অন্যান্য বৈশিষ্ট্য নির্ধারণ করে।@Column: ডাটাবেস টেবিলের নির্দিষ্ট একটি কলামের সঙ্গে জাভা ক্লাসের একটি ফিল্ড সংযুক্ত করতে ব্যবহৃত হয়।
Table Mapping: @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ব্যবহার করে ক্লাসকে Entity হিসেবে চিহ্নিত করা। - টেবিল ম্যাপিং:
@Tableব্যবহার করে ডাটাবেস টেবিলের নাম কনফিগার করা। - কলাম ম্যাপিং:
@Columnব্যবহার করে প্রতিটি ফিল্ডকে কলামের সঙ্গে সংযুক্ত করা। - Hibernate বা JPA Repository তৈরি করা: ডেটাবেস অপারেশন সহজ করার জন্য Spring Data JPA ব্যবহার করা।
উদাহরণ: Spring Boot এ @Table এবং @Column সহ একটি পূর্ণাঙ্গ Entity
import 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
}
Repository এবং Service লেয়ার
Repository তৈরি
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {
}
Service লেয়ার
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 Relationship
একটি টেবিলের একটি রেকর্ড আরেকটি টেবিলের মাত্র একটি রেকর্ডের সাথে সম্পর্কিত হলে এটি One-to-One সম্পর্ক।
উদাহরণ
প্রতিটি ব্যবহারকারীর (User) একটি অ্যাড্রেস (Address) থাকতে পারে।
Entity ক্লাস
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
}
Key Points:
@OneToOne: সম্পর্ক নির্দেশ করে।@JoinColumn:address_idকলাম দিয়ে দুটি টেবিল লিঙ্ক করে।
One-to-Many Relationship
একটি টেবিলের একটি রেকর্ড আরেকটি টেবিলের একাধিক রেকর্ডের সাথে সম্পর্কিত হলে এটি One-to-Many সম্পর্ক।
উদাহরণ
একটি ক্যাটেগরির (Category) একাধিক প্রোডাক্ট (Product) থাকতে পারে।
Entity ক্লাস
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
}
Key Points:
@OneToMany: একাধিক সম্পর্ক নির্দেশ করে।@ManyToOne: বিপরীত সম্পর্ক নির্দেশ করে।mappedBy: মূল সম্পর্কের ফিল্ডের নাম দেখায়।
Many-to-Many Relationship
দুটি টেবিলের একাধিক রেকর্ড একে অপরের সাথে সম্পর্কিত হলে এটি Many-to-Many সম্পর্ক।
উদাহরণ
একটি শিক্ষার্থী (Student) একাধিক কোর্স (Course) নিতে পারে এবং একটি কোর্সে একাধিক শিক্ষার্থী থাকতে পারে।
Entity ক্লাস
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
}
Key Points:
@ManyToMany: সম্পর্ক নির্দেশ করে।@JoinTable: মধ্যবর্তী টেবিলের নাম এবং কলাম নির্ধারণ করে।inverseJoinColumns: বিপরীত দিকের টেবিলের কলাম নির্ধারণ করে।
সারাংশ
- One-to-One: দুই টেবিলের একটি রেকর্ড একটি রেকর্ডের সাথে সম্পর্কিত।
- One-to-Many: একটি রেকর্ড একাধিক রেকর্ডের সাথে সম্পর্কিত।
- Many-to-Many: দুই টেবিলের একাধিক রেকর্ড একে অপরের সাথে সম্পর্কিত।
এই সম্পর্কগুলো স্প্রিং ওআরএম এবং Hibernate এর মাধ্যমে ডেটাবেস মডেলিং সহজ করে।
Entity Mapping হলো ORM (Object Relational Mapping) এর একটি গুরুত্বপূর্ণ দিক, যা ডাটাবেজ টেবিল এবং Java ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করে। Spring ORM এর মাধ্যমে Hibernate ব্যবহার করে সহজেই Entity Mapping করা যায়।
Entity Mapping প্রকারভেদ
১. Single Table Mapping
একটি Java ক্লাস সরাসরি একটি টেবিলের সঙ্গে যুক্ত থাকে।
২. Relationship Mapping
- One-to-One: একটি Entity অন্য একটি Entity এর সাথে ১:১ সম্পর্ক তৈরি করে।
- One-to-Many: একটি Entity অন্য Entity এর সাথে ১ থেকে অনেক সম্পর্ক তৈরি করে।
- Many-to-Many: দুই Entity এর মধ্যে অনেক থেকে অনেক সম্পর্ক তৈরি করে।
উদাহরণ সহ Entity Mapping
এখানে আমরা একাধিক ধরণের Entity Mapping এর উদাহরণ দেখাবো।
Single Table 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 টেবিল তৈরি করে।
One-to-One Mapping
একটি 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;
}
}
One-to-Many Mapping
একটি 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;
}
}
Many-to-Many Mapping
দুই 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