Hibernate একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java অবজেক্ট এবং রিলেশনাল ডেটাবেসের মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Hibernate Entity এবং Table Mapping এর মাধ্যমে ডেটাবেস টেবিল এবং Java অবজেক্টের মধ্যে ম্যাপিং তৈরি করা হয়, যা ডেটাবেসের অপারেশনগুলি অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে পরিচালনা করতে সক্ষম করে।
Hibernate-এ Entity এবং Table Mapping প্রধানত Anatomy of an Entity Class (এনোটেশন ভিত্তিক) এবং Table সম্পর্ক স্থাপন করে। এখানে Entity ক্লাসের মাধ্যমে Java অবজেক্টকে একটি রিলেশনাল ডেটাবেস টেবিলের সঙ্গে ম্যাপ করা হয়।
Entity এবং Table Mapping এর ধারণা
- Entity: Hibernate এ Entity হচ্ছে একটি Java ক্লাস যা ডেটাবেসের টেবিলের সাথে সম্পর্কযুক্ত। এটি
@Entityএনোটেশন দ্বারা চিহ্নিত করা হয় এবং এতে সাধারণত একটি@Idফিল্ড থাকে যা টেবিলের primary key হিসেবে ব্যবহৃত হয়। - Table: @Table এনোটেশনটি ব্যবহার করে Entity ক্লাসটি একটি ডেটাবেস টেবিলের সাথে সম্পর্কযুক্ত করা হয়। যদি আপনি @Table এনোটেশন না ব্যবহার করেন, তবে Hibernate ডিফল্টভাবে Entity ক্লাসের নামটি টেবিলের নাম হিসেবে ব্যবহার করবে।
Entity এবং Table Mapping এর উদাহরণ
এখানে আমরা একটি Employee Entity ক্লাস এবং employee টেবিলের মধ্যে ম্যাপিং দেখাবো।
Step 1: Entity Class তৈরি করা
import javax.persistence.*;
@Entity
@Table(name="employee") // Mapping the entity to the "employee" table
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generate the primary key value
@Column(name="id") // Column name for the primary key
private int id;
@Column(name="name") // Column name in the table for "name"
private String name;
@Column(name="salary") // Column name in the table for "salary"
private double salary;
// Constructor, Getters and Setters
public Employee() {}
public Employee(String name, double salary) {
this.name = name;
this.salary = salary;
}
// 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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
এখানে:
- @Entity: এই এনোটেশনটি Hibernate কে জানায় যে এটি একটি Entity ক্লাস এবং এটি একটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।
- @Table(name="employee"): এটি Entity ক্লাসের সাথে ডেটাবেস টেবিল
employeeএর সম্পর্ক স্থাপন করে। - @Id: এটি নির্ধারণ করে যে কোন ফিল্ডটি টেবিলের primary key হবে।
- @GeneratedValue(strategy = GenerationType.IDENTITY): এটি Hibernate-কে বলে যে primary key ফিল্ডের মান auto-generated হবে।
- @Column(name="name"): এটি নিশ্চিত করে যে
nameফিল্ডটি ডেটাবেস টেবিলের name কলামের সাথে সম্পর্কিত।
Step 2: Hibernate Configuration File (hibernate.cfg.xml)
Hibernate কনফিগারেশন ফাইলটি তৈরি করতে হবে যাতে ডেটাবেসের সাথে সংযোগ স্থাপন করা যায়। এটি সাধারণত src/main/resources ফোল্ডারে রাখা হয়।
<!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 connection settings -->
<property name="hibernate.connection.driver_class">org.h2.Driver</property>
<property name="hibernate.connection.url">jdbc:h2:mem:testdb</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>
<!-- Specify 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>
<!-- Disable the second-level cache -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>
</session-factory>
</hibernate-configuration>
এখানে:
- hibernate.connection.url: ডেটাবেসের URL (এখানে H2 ইন-মেমরি ডেটাবেস ব্যবহৃত হচ্ছে)।
- hibernate.dialect: Hibernate কে ডেটাবেসের ধরন নির্দেশ করে।
- hibernate.show_sql: Hibernate এর মাধ্যমে প্রেরিত SQL কুয়েরি দেখতে এটি
trueকরা হয়েছে।
Step 3: Hibernate SessionFactory তৈরি এবং CRUD অপারেশন
Hibernate সেশন ফ্যাক্টরি তৈরি করতে এবং ডেটাবেসের সাথে CRUD অপারেশন করতে নিম্নলিখিত কোড ব্যবহার করা যেতে পারে।
import org.hibernate.*;
import org.hibernate.cfg.Configuration;
public class EmployeeDAO {
public static void main(String[] args) {
// SessionFactory তৈরি করা
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(Employee.class)
.buildSessionFactory();
// সেশন তৈরি করা
Session session = factory.getCurrentSession();
try {
// Create a new Employee object
Employee employee = new Employee("John Doe", 50000);
// Start a transaction
session.beginTransaction();
// Save the Employee object
session.save(employee);
// Commit the transaction
session.getTransaction().commit();
// Retrieve the Employee based on the id
session = factory.getCurrentSession();
session.beginTransaction();
Employee retrievedEmployee = session.get(Employee.class, employee.getId());
System.out.println("Retrieved Employee: " + retrievedEmployee);
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
এখানে:
- SessionFactory তৈরি করা হচ্ছে, যা Hibernate কনফিগারেশন এবং Entity ক্লাসের মাধ্যমে সেশন পরিচালনা করে।
- Session.save() মেথড ব্যবহার করে
Employeeঅবজেক্ট ডেটাবেসে সেভ করা হচ্ছে। - Session.get() মেথড ব্যবহার করে নির্দিষ্ট
Employeeঅবজেক্ট রিট্রিভ করা হচ্ছে।
Entity এবং Table Mapping এর উপকারিতা
| ফিচার | বিবরণ |
|---|---|
| Object-Relational Mapping | Hibernate ডেটাবেস টেবিল এবং Java অবজেক্টের মধ্যে সম্পর্ক তৈরি করে। |
| Automated Table Creation | Hibernate এনোটেশন বা XML কনফিগারেশন দিয়ে ডেটাবেস টেবিল স্বয়ংক্রিয়ভাবে তৈরি করে। |
| Loose Coupling | Java ক্লাস এবং ডেটাবেস টেবিলের মধ্যে loose coupling নিশ্চিত করে। |
| Cross-Database Compatibility | Hibernate বিভিন্ন ডেটাবেসের সাথে কাজ করার ক্ষমতা রাখে। |
Hibernate এর Entity এবং Table Mapping এর মাধ্যমে আপনি Java Objects কে relational database tables এর সাথে ম্যাপ করতে পারেন। @Entity, @Table, @Id, এবং @Column এনোটেশন ব্যবহার করে ডেটাবেস টেবিলের সাথে সম্পর্ক স্থাপন করা হয়। Hibernate এর সাহায্যে ডেটাবেসের CRUD অপারেশন করা সহজ হয় এবং এটি ডেটাবেস নিরপেক্ষ সমাধান প্রদান করে, যা একাধিক ডেটাবেসে কাজ করতে সক্ষম। Hibernate এর ORM পদ্ধতিতে কাজ করা ডেটাবেসের সাথে উন্নত পারফরম্যান্স এবং রক্ষণাবেক্ষণ সুবিধা প্রদান করে।
Hibernate হল একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক যা Java objects এবং relational database tables এর মধ্যে সম্পর্ক তৈরি এবং পরিচালনা করে। Hibernate এর মাধ্যমে, আপনি Java ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক প্রতিষ্ঠা করতে পারেন, যাতে অবজেক্ট রিলেশনাল ম্যাপিং সহজ এবং স্বচ্ছ হয়।
Hibernate-এর Entity এবং Table এর মধ্যে সম্পর্ক কিভাবে কাজ করে তা বোঝার জন্য আমাদের কিছু মৌলিক ধারণা জানা প্রয়োজন। এখানে Entity ক্লাস এবং Table এর মধ্যে সম্পর্ক প্রতিষ্ঠা করার পদ্ধতি, এবং annotations ব্যবহার করে কিভাবে এটি করা হয়, তা বিস্তারিতভাবে আলোচনা করা হবে।
1. Entity এবং Table: বেসিক ধারণা
- Entity: Hibernate এ একটি Entity হলো একটি Java class যা ডেটাবেসের একটি টেবিলের সাথে সম্পর্কিত। Entity ক্লাসের প্রতিটি অবজেক্ট একটি রেকর্ড হিসাবে ডেটাবেস টেবিলে সংরক্ষিত হয়। Entity ক্লাসটি সাধারণত একটি POJO (Plain Old Java Object) হয় এবং এতে annotations বা XML কনফিগারেশন ব্যবহার করে টেবিলের সাথে সম্পর্ক স্থাপন করা হয়।
- Table: Table হল ডেটাবেসের একটি কাঠামো যা rows (records) এবং columns (fields) এর মধ্যে ডেটা সংরক্ষণ করে। Hibernate Entity ক্লাসের ক্ষেত্রগুলো (fields) টেবিলের কলাম হিসেবে ম্যাপ করা হয়, এবং Entity ক্লাসের ইনস্ট্যান্স টেবিলের রেকর্ড (row) হিসেবে ব্যবহৃত হয়।
2. Hibernate Entity ক্লাসের তৈরি এবং টেবিলের সাথে সম্পর্ক
Hibernate এ Entity এবং Table এর মধ্যে সম্পর্ক স্থাপনের জন্য @Entity এবং @Table অ্যানোটেশন ব্যবহৃত হয়।
@Entity অ্যানোটেশন:
- @Entity অ্যানোটেশন Hibernate কে জানায় যে এটি একটি entity class এবং এই ক্লাসটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।
@Table অ্যানোটেশন:
- @Table অ্যানোটেশন ব্যবহার করে, আপনি Entity ক্লাসের জন্য ডেটাবেস টেবিলের নাম স্পেসিফাই করতে পারেন। যদি এই অ্যানোটেশনটি ব্যবহার না করেন, তবে Hibernate ডিফল্টভাবে Entity ক্লাসের নাম ব্যবহার করে টেবিলের নাম ধরে নেবে।
3. Hibernate Entity এবং Table এর মধ্যে সম্পর্ক উদাহরণ
ধরা যাক, আমাদের একটি User নামের Entity ক্লাস আছে এবং আমরা এটিকে একটি users টেবিলের সাথে সম্পর্কিত করতে চাই।
Entity ক্লাস (User.java):
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
@Entity
@Table(name = "users") // Mapping this entity to the 'users' table in the database
public class User {
@Id // Marks the primary key
private int id;
private String name;
private String email;
// Constructor, getters and setters
public User() {}
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
// 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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
ব্যাখ্যা:
- @Entity:
Userক্লাসটি একটি Entity হিসেবে চিহ্নিত করেছে, যা ডেটাবেসের একটি টেবিলের সাথে সম্পর্কিত। - @Table(name = "users"):
Userক্লাসটিusersটেবিলের সাথে সম্পর্কিত। এটি ডেটাবেসেusersনামের টেবিলটি মানে যে ডেটাবেসে এই টেবিলের সঙ্গে সম্পর্কিত সব রেকর্ড User ক্লাসের অবজেক্টের মতো আচরণ করবে। - @Id:
idফিল্ডটি প্রাইমারি কী হিসেবে চিহ্নিত করা হয়েছে, যেটি ডেটাবেস টেবিলের রেকর্ডের জন্য একটি ইউনিক আইডেন্টিফায়ার হিসেবে কাজ করবে।
4. Hibernate Mapping Between Entity and Table
এখন User Entity ক্লাসটির সাথে সম্পর্কিত ডেটাবেস টেবিল users হতে হবে, যেখানে তিনটি কলাম থাকবে:
- id: প্রাইমারি কী হিসেবে কাজ করবে।
- name: ব্যবহারকারীর নাম।
- email: ব্যবহারকারীর ইমেল।
Hibernate ডাটাবেসের users টেবিলের কলামগুলি স্বয়ংক্রিয়ভাবে Entity ক্লাসের ফিল্ডগুলির সাথে ম্যাপ করে।
Database Table (users) Example:
| id | name | |
|---|---|---|
| 1 | John Doe | john@example.com |
| 2 | Jane Smith | jane@example.com |
এখানে, id, name, এবং email কলামগুলো Hibernate Entity ক্লাস User এর fields হিসেবে ম্যাপ হবে।
5. Hibernate Entity Class থেকে ডেটাবেসে ইনসার্ট করা
Hibernate ব্যবহার করে ডেটাবেসে insert করার জন্য, সাধারণত Session ব্যবহৃত হয়। Hibernate সেশন অবজেক্ট ব্যবহার করে ডেটাবেসে অবজেক্ট সেভ করা হয়।
Hibernate Insert Example:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateExample {
public static void main(String[] args) {
// Create session factory
SessionFactory factory = new Configuration()
.configure("hibernate.cfg.xml")
.addAnnotatedClass(User.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Create a new User object
User newUser = new User(1, "John Doe", "john@example.com");
// Start a transaction
session.beginTransaction();
// Save the User object
session.save(newUser);
// Commit the transaction
session.getTransaction().commit();
} finally {
factory.close();
}
}
}
ব্যাখ্যা:
session.save(newUser)লাইনেUserঅবজেক্টটিusersটেবিলে ইনসার্ট করা হবে। Hibernate অটোমেটিকভাবে User Entity ক্লাসের ফিল্ডগুলির মানusersটেবিলের কলামগুলির সঙ্গে ম্যাপ করে ইনসার্ট করবে।
6. Entity এবং Table এর সম্পর্কের আরও কিছু কনফিগারেশন
@IdClass বা @EmbeddedId:
- @IdClass বা @EmbeddedId অ্যানোটেশন ব্যবহার করে আপনি যৌথ প্রাইমারি কী ব্যবহার করতে পারেন।
@Entity
@IdClass(UserId.class) // Composite primary key using UserId class
public class User {
@Id
private int id;
@Id
private String username;
}
এখানে UserId ক্লাসটি দুটি ফিল্ড (id এবং username) ব্যবহার করে একটি যৌথ প্রাইমারি কী তৈরি করবে।
Hibernate Entity এবং Table এর মধ্যে সম্পর্ক অত্যন্ত গুরুত্বপূর্ণ, কারণ এটি Java objects এবং relational database tables এর মধ্যে সঠিক ম্যাপিং এবং ডেটা ব্যবস্থাপনা নিশ্চিত করে। Hibernate অ্যানোটেশন ব্যবহার করে, আপনি সহজেই Java ক্লাস এবং ডেটাবেস টেবিলের মধ্যে সম্পর্ক স্থাপন করতে পারেন এবং Hibernate ORM প্রযুক্তি ব্যবহারের মাধ্যমে ডেটাবেস ইন্টারঅ্যাকশন প্রক্রিয়া অনেক সহজ এবং কার্যকরী করে তোলে।
@Entity এবং @Table অ্যানোটেশনগুলি Entity এবং Table এর মধ্যে সম্পর্ক প্রতিষ্ঠা করার মূল উপাদান। এগুলি ডেটাবেসের টেবিলের কলামগুলির সঙ্গে Java অবজেক্টের ফিল্ডগুলির ম্যাপিং নিশ্চিত করে। Hibernate এর মাধ্যমে, আপনি এই সম্পর্কগুলি সহজেই কনফিগার এবং পরিচালনা করতে পারেন।
Hibernate হল একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা জাভা অ্যাপ্লিকেশনে ডেটাবেস পরিচালনা করার জন্য ব্যবহৃত হয়। Hibernate-এ, ডেটাবেস টেবিলের সাথে Java classes কে মাপ (map) করার জন্য কিছু অ্যানোটেশন ব্যবহার করা হয়। এর মধ্যে @Entity এবং @Table অ্যানোটেশন দুটি খুব গুরুত্বপূর্ণ, কারণ এগুলি ডেটাবেস টেবিল এবং জাভা ক্লাসের মধ্যে সম্পর্ক নির্ধারণ করে।
1. @Entity Annotation
@Entity অ্যানোটেশনটি Hibernate-এ একটি Java ক্লাসকে ডেটাবেস টেবিলের সাথে ম্যাপ করার জন্য ব্যবহৃত হয়। এই অ্যানোটেশনটি Hibernate কে জানায় যে এই ক্লাসটি একটি persistent entity এবং এটি একটি ডেটাবেস টেবিলের সাথে সম্পর্কিত।
@Entityক্লাসের উপর ব্যবহৃত হয়।- প্রতিটি
@Entityক্লাসে অন্তত একটি@Idঅ্যানোটেশন থাকা উচিত, যা এই ক্লাসের প্রাইমারি কী (primary key) নির্ধারণ করে।
@Entity ব্যবহার:
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity // Specifies that this class is an entity
public class User {
@Id // Marks this field as the primary key
private int id;
private String name;
private String email;
// 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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এখানে, @Entity অ্যানোটেশন User ক্লাসে ব্যবহৃত হয়েছে, যা Hibernate কে জানায় যে এই ক্লাসটি ডেটাবেসের একটি টেবিলের সাথে সম্পর্কিত। @Id অ্যানোটেশনটি id ফিল্ডকে প্রাইমারি কী হিসেবে নির্ধারণ করেছে।
2. @Table Annotation
@Table অ্যানোটেশনটি ডেটাবেস টেবিলের নাম এবং অন্যান্য গুণাবলী (properties) কনফিগার করার জন্য ব্যবহৃত হয়। এটি ঐচ্ছিক (optional), তবে যদি ডিফল্ট টেবিল নাম (যা ক্লাসের নামের সাথে মেলে) পরিবর্তন করতে চান, তাহলে @Table অ্যানোটেশন ব্যবহার করতে হবে।
@Tableঅ্যানোটেশনটি@Entityক্লাসে ব্যবহৃত হয়।@Tableঅ্যানোটেশনের মধ্যেnameপ্যারামিটার ব্যবহার করে ডেটাবেস টেবিলের নাম নির্ধারণ করা যায়।
@Table ব্যবহার:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "users") // Specifies the name of the table in the database
public class User {
@Id // Marks this field as the primary key
private int id;
private String name;
private String email;
// 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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এখানে, @Table(name = "users") ব্যবহার করে User ক্লাসটি users নামের টেবিলের সাথে ম্যাপ করা হয়েছে। যদি আপনি @Table না ব্যবহার করেন, তবে Hibernate ক্লাসের নামের সাথে মেলে এমন ডেটাবেস টেবিল তৈরি করবে (যেমন User ক্লাসের জন্য user টেবিল)।
@Entity এবং @Table এর মধ্যে সম্পর্ক
@Entityঅ্যানোটেশন শুধুমাত্র ক্লাসটিকে একটি persistent entity হিসেবে চিহ্নিত করে, যাতে Hibernate সেই ক্লাসকে একটি টেবিলের সাথে সম্পর্কিত হিসেবে বিবেচনা করে।@Tableঅ্যানোটেশন টেবিলের নাম এবং অন্যান্য বৈশিষ্ট্য কাস্টমাইজ করতে ব্যবহৃত হয়, যেমন টেবিলের নাম, ইনডেক্স, টেবিলের স্কিমা ইত্যাদি।
@Table এর আরও বৈশিষ্ট্য:
name: টেবিলের নাম নির্ধারণ করে। যদি এই প্যারামিটারটি ব্যবহার না করা হয়, তবে ডিফল্টভাবে ক্লাসের নামের সাথে মেলে এমন টেবিল তৈরি করা হয়।schema: টেবিলের স্কিমা নির্ধারণ করে (যেমন, যদি ডাটাবেসে বিভিন্ন স্কিমা থাকে)।catalog: টেবিলের ক্যাটালগ নির্ধারণ করে।uniqueConstraints: টেবিলের উপর ইউনিক কনস্ট্রেইনটস যোগ করতে ব্যবহৃত হয়।
উদাহরণ: @Table এর পূর্ণ ব্যবহার
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
@Entity
@Table(
name = "users", // Table name
schema = "app_schema", // Schema name (optional)
uniqueConstraints = {@UniqueConstraint(columnNames = {"email"})} // Unique constraint on 'email' column
)
public class User {
@Id
private int id;
private String name;
private String email;
// 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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এখানে, @Table এর মধ্যে uniqueConstraints ব্যবহার করে email কলামে ইউনিক কনস্ট্রেইন্ট যোগ করা হয়েছে, যার মানে হলো এই কলামে একাধিক রিপিটেড মান থাকতে পারবে না।
@Entity এবং @Table অ্যানোটেশন ব্যবহার করার উপকারিতা:
- ডেটাবেস টেবিলের সাথে অবজেক্ট ম্যাপিং:
@Entityএবং@Tableব্যবহারের মাধ্যমে আপনি ডেটাবেস টেবিলের সাথে জাভা অবজেক্টের সম্পর্ক তৈরি করতে পারেন।
- ডেটাবেস নিরপেক্ষতা:
- Hibernate আপনাকে ডেটাবেসের নির্দিষ্ট কোড লেখার পরিবর্তে অবজেক্ট-ওরিয়েন্টেড মডেল ব্যবহার করার সুযোগ দেয়। এতে আপনি ডেটাবেসের বিভিন্ন ধরনের ব্যবহারের পরিবর্তে এক কনসিস্টেন্ট কোড ব্যবহার করতে পারেন।
- টেবিলের কাস্টমাইজেশন:
@Tableঅ্যানোটেশন ব্যবহার করে আপনি টেবিলের নাম, স্কিমা, ইউনিক কনস্ট্রেইনটস ইত্যাদি কাস্টমাইজ করতে পারেন।
@Entityএবং@Tableঅ্যানোটেশনগুলি Hibernate এ ডেটাবেস টেবিল এবং জাভা ক্লাসের মধ্যে সম্পর্ক স্থাপন করে।@Entityক্লাসকে একটি persistent entity হিসেবে চিহ্নিত করে, এবং@Tableডেটাবেস টেবিলের নাম এবং অন্যান্য কনফিগারেশন কাস্টমাইজ করতে সহায়তা করে।
Hibernate ব্যবহার করলে আপনি সহজেই অবজেক্ট-ওরিয়েন্টেড পদ্ধতিতে ডেটাবেস ম্যানিপুলেশন করতে পারবেন, যা কোডকে আরও পরিষ্কার এবং মেইন্টেনেবল করে তোলে।
Hibernate হল একটি Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক, যা Java objects এবং relational databases এর মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। Hibernate-এ একটি Entity Class তৈরি করার মাধ্যমে, আপনি Java objects কে database tables এর সাথে ম্যাপ করতে পারেন।
Hibernate Entity Class তৈরি করার জন্য কিছু নির্দিষ্ট annotations (যেমন @Entity, @Id, @GeneratedValue, @Column) ব্যবহার করতে হয়। এই Entity ক্লাসে Java objects এবং database tables এর মধ্যে সম্পর্ক নির্ধারণ করা হয়।
Hibernate Entity Class তৈরি করার ধাপ
ধাপ 1: Entity Class তৈরি করুন
এখানে আমরা একটি Employee ক্লাস তৈরি করব যা Hibernate Entity হিসেবে কাজ করবে। এই ক্লাসটি ডেটাবেসের employee টেবিলের সাথে সম্পর্কিত হবে।
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Column;
@Entity // Mark this class as an Entity to be mapped to a table
@Table(name = "employee") // Specifies the table name in the database
public class Employee {
@Id // Marks the primary key of the table
@GeneratedValue(strategy = GenerationType.IDENTITY) // Auto-generate the ID for new records
private int id;
@Column(name = "name") // Maps the 'name' column to the 'name' attribute
private String name;
@Column(name = "department") // Maps the 'department' column to the 'department' attribute
private String department;
@Column(name = "salary") // Maps the 'salary' column to the 'salary' attribute
private double salary;
// Default constructor
public Employee() {}
// Constructor with all fields
public Employee(String name, String department, double salary) {
this.name = name;
this.department = department;
this.salary = salary;
}
// 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;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
Explanation:
@Entity: এই অ্যানোটেশনটি Hibernate কে জানিয়ে দেয় যে এই ক্লাসটি একটি Entity এবং এটি ডেটাবেসের একটি টেবিলের সাথে ম্যাপ হবে।@Table(name = "employee"): এটি ডেটাবেসের টেবিলের নাম সুনির্দিষ্ট করে দেয় (যদি ডিফল্ট নামটি ব্যবহার না করতে চান)।@Id: এটি primary key (অথবা unique identifier) হিসেবে নির্ধারণ করে।@GeneratedValue(strategy = GenerationType.IDENTITY): এটি Hibernate কে বলে যে, primary key (id) ফিল্ডটি auto-generated হবে (অথবা auto-increment)।@Column(name = "name"): এই অ্যানোটেশনটি ডেটাবেসের সঠিক কলামের সাথে Java field কে ম্যাপ করতে সাহায্য করে।
ধাপ 2: Hibernate Configuration ফাইল তৈরি করুন
Hibernate Entity ক্লাস কাজ করার জন্য আপনাকে Hibernate Configuration file তৈরি করতে হবে। এই কনফিগারেশন ফাইলে ডেটাবেস সংযোগ এবং অন্যান্য সেটিংস নির্ধারণ করা হয়। সাধারণত এই ফাইলের নাম hibernate.cfg.xml হয়।
<?xml version="1.0" encoding="UTF-8"?>
<!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 connection settings -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<!-- JDBC connection pool settings -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">20</property>
<!-- Specify dialect -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
<!-- Enable Hibernate's automatic session context management -->
<property name="hibernate.current_session_context_class">thread</property>
<!-- Show SQL -->
<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 class="com.example.model.Employee"/>
</session-factory>
</hibernate-configuration>
Explanation of Configuration:
hibernate.connection.driver_class: JDBC ড্রাইভার ক্লাস।hibernate.connection.url: ডেটাবেসের URL।hibernate.connection.usernameএবংhibernate.connection.password: ডেটাবেসের ইউজারনেম এবং পাসওয়ার্ড।hibernate.dialect: Hibernate কে ডেটাবেসের ডায়ালেক্ট জানায় (এখানে MySQL ব্যবহার করা হয়েছে)।hibernate.hbm2ddl.auto: ডেটাবেস স্কিমা তৈরি বা আপডেট করার জন্যupdateসেট করা হয়েছে, যা ডেটাবেস স্কিমা আপডেট করবে।
ধাপ 3: Hibernate Session ব্যবহার করে ডেটাবেস অপারেশন
Hibernate Entity ক্লাসের মাধ্যমে ডেটাবেসে CRUD (Create, Read, Update, Delete) অপারেশন করতে হলে আপনাকে Session ব্যবহার করতে হবে। Session হল Hibernate-এর একটি API যা ডেটাবেসের সাথে transactions পরিচালনা করে।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateApp {
public static void main(String[] args) {
// Create SessionFactory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml").addAnnotatedClass(Employee.class).buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Create a new Employee object
Employee employee = new Employee("John", "IT", 5000);
// Start a transaction
session.beginTransaction();
// Save the employee object
session.save(employee);
// Commit the transaction
session.getTransaction().commit();
System.out.println("Employee saved with id: " + employee.getId());
} finally {
factory.close();
}
}
}
Explanation:
- SessionFactory: Hibernate
SessionFactoryতৈরি করে, যা Hibernate configuration file থেকে কনফিগারেশন লোড করে এবংEmployeeEntity ক্লাসকে ম্যাপ করে। - Session:
Sessionব্যবহার করে ডেটাবেসে ট্রানজেকশন শুরু এবং শেষ করা হয়। - Save():
session.save()মেথডের মাধ্যমে Employee অবজেক্ট ডেটাবেসে সেভ করা হয়।
- Hibernate Entity Class হল একটি POJO (Plain Old Java Object) ক্লাস যা annotations বা XML ফাইল ব্যবহার করে ডেটাবেস টেবিলের সাথে সম্পর্কিত হয়।
- Hibernate-এ Entity Class তৈরি করার জন্য
@Entity,@Id,@Columnইত্যাদি অ্যানোটেশন ব্যবহার করা হয়। - Hibernate automatic mapping প্রদান করে, যাতে আপনি Java objects এবং database tables এর মধ্যে সম্পর্ক তৈরি করতে পারেন।
- Hibernate ব্যবহার করার মাধ্যমে SQL কোডের সংখ্যা কমে যায় এবং আপনি object-oriented স্টাইলে ডেটাবেসের সাথে কাজ করতে পারেন।
Hibernate (হাইবারনেট) একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা Java অ্যাপ্লিকেশনগুলিতে ডেটাবেস ইন্টিগ্রেশনকে সহজ করে তোলে। Hibernate-এ Entity ক্লাস তৈরি করার সময়, প্রতিটি Entity এর জন্য একটি Primary Key (প্রাথমিক কী) নির্ধারণ করা হয়। Hibernate এই প্রাথমিক কী এর মাধ্যমে একটি ইউনিক আইডেন্টিফায়ার তৈরি করে, যা ডেটাবেস টেবিলের মধ্যে প্রতিটি রেকর্ডকে আলাদা করে। এর জন্য Hibernate বিভিন্ন পদ্ধতি ব্যবহার করে Primary Key নির্ধারণ এবং Generated Value পরিচালনা করতে পারে।
Hibernate Entity এর জন্য Primary Key এবং Generated Value
Hibernate এ Primary Key এবং Generated Value ব্যবহারের জন্য দুটি গুরুত্বপূর্ণ অ্যানোটেশন রয়েছে:
- @Id - প্রাথমিক কী (Primary Key) নির্দেশ করতে ব্যবহৃত হয়।
- @GeneratedValue - Hibernate কে জানাতে ব্যবহৃত হয় যে প্রাথমিক কীটি স্বয়ংক্রিয়ভাবে তৈরি হবে, যেমন auto-increment (ডেটাবেস দ্বারা).
1. @Id এবং @GeneratedValue এর ব্যবহার
@Id:
এই অ্যানোটেশনটি ব্যবহৃত হয় একটি ক্লাসের ক্ষেত্রকে Primary Key হিসেবে চিহ্নিত করতে।
@GeneratedValue:
এটি Hibernate কে নির্দেশ দেয় যে এই ক্ষেত্রের মানটি স্বয়ংক্রিয়ভাবে তৈরি করা হবে। এটি সাধারণত primary key ক্ষেত্রের জন্য ব্যবহৃত হয়, যেখানে Hibernate বা ডেটাবেস সার্ভার প্রাথমিক কী তৈরি করে (যেমন auto-increment ব্যবহার করে)।
@GeneratedValue এর ধরণ:
Hibernate-এ @GeneratedValue এর সাথে কিছু পদ্ধতি ব্যবহার করা যেতে পারে, যেমন:
- GenerationType.AUTO: Hibernate ডেটাবেসের সক্ষমতার উপর ভিত্তি করে কী তৈরি করবে (যেমন, auto-increment for MySQL)।
- GenerationType.IDENTITY: ডেটাবেসের identity column ব্যবহার করবে, যা সাধারণত auto-increment।
- GenerationType.SEQUENCE: একটি sequence ব্যবহার করবে (প্রধানত Oracle এবং PostgreSQL-এ ব্যবহৃত)।
- GenerationType.TABLE: একটি টেবিল ব্যবহার করে কী তৈরি করবে (কম ব্যবহৃত)।
উদাহরণ: Hibernate Entity ক্লাসে Primary Key এবং Generated Value ব্যবহার
1. Entity ক্লাস তৈরি করা:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
@Entity
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO) // Automatically generated primary key
private int id;
private String name;
private String email;
// Default constructor
public User() {}
// 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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
এখানে:
@Idব্যবহার করা হয়েছেidক্ষেত্রকে Primary Key হিসেবে চিহ্নিত করতে।@GeneratedValue(strategy = GenerationType.AUTO)ব্যবহার করা হয়েছে যাতে Hibernate ডেটাবেসের সক্ষমতা অনুসারে প্রাথমিক কীটি স্বয়ংক্রিয়ভাবে তৈরি করতে পারে (যেমন MySQL এর auto-increment বা PostgreSQL এর serial ক্ষেত্র)।
2. Hibernate কনফিগারেশন এবং EntityManager ব্যবহার:
Hibernate কনফিগারেশন ফাইল (hibernate.cfg.xml) এবং EntityManager ব্যবহার করে ডেটাবেসে ইনসার্ট করা:
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateDemo {
public static void main(String[] args) {
// Create SessionFactory
SessionFactory factory = new Configuration().configure("hibernate.cfg.xml")
.addAnnotatedClass(User.class)
.buildSessionFactory();
// Create session
Session session = factory.getCurrentSession();
try {
// Create a new User object
User user = new User();
user.setName("John Doe");
user.setEmail("john.doe@example.com");
// Start a transaction
session.beginTransaction();
// Save the User object (this will generate the primary key automatically)
session.save(user);
// Commit the transaction
session.getTransaction().commit();
System.out.println("Generated ID: " + user.getId()); // Print the auto-generated ID
} finally {
factory.close();
}
}
}
এখানে:
- Session.save(user) ব্যবহৃত হয়েছে
Userঅবজেক্টটিকে ডেটাবেসে সেভ করতে, যেখানে Primary Keyidস্বয়ংক্রিয়ভাবে তৈরি হবে।
3. Primary Key Generation Strategy Examples:
GenerationType.IDENTITY:
এই স্ট্রাটেজি সাধারণত MySQL বা PostgreSQL এ ব্যবহৃত হয়, যেখানে ডেটাবেস auto-increment ফিচার ব্যবহার করে। Hibernate ডেটাবেসের নিজস্ব identity column থেকে আইডি নেয়।
@GeneratedValue(strategy = GenerationType.IDENTITY)
GenerationType.SEQUENCE:
এই স্ট্রাটেজি সাধারণত Oracle বা PostgreSQL-এ ব্যবহৃত হয়, যেখানে sequence ব্যবহার করে আইডি তৈরি হয়।
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "user_sequence")
@SequenceGenerator(name = "user_sequence", sequenceName = "user_seq", allocationSize = 1)
এখানে @SequenceGenerator ব্যবহার করা হয়েছে, যা ডেটাবেসের sequence টেবিলের মাধ্যমে প্রাথমিক কী তৈরি করবে।
GenerationType.TABLE:
এই স্ট্রাটেজি ব্যবহার করা হয় যেখানে ডেটাবেসে একটি table ব্যবহার করে primary key তৈরি করা হয়। এটি কম ব্যবহৃত, কিন্তু কিছু নির্দিষ্ট পরিস্থিতিতে উপকারী হতে পারে।
@GeneratedValue(strategy = GenerationType.TABLE, generator = "user_table_generator")
@TableGenerator(name = "user_table_generator", table = "id_generator", pkColumnName = "entity_name", valueColumnName = "next_id", pkColumnValue = "user_id", initialValue = 100, allocationSize = 1)
এখানে @TableGenerator ব্যবহার করা হয়েছে, যা একটি টেবিলের মাধ্যমে ডেটাবেসে প্রাথমিক কী তৈরি করবে।
4. Hibernate এর Primary Key এবং Generated Value-এর সুবিধা:
- Automatic ID Generation: Hibernate ব্যবহার করলে primary key স্বয়ংক্রিয়ভাবে তৈরি হয়, এবং আপনি কোনো SQL কোড বা ম্যানুয়ালি আইডি নির্ধারণ করতে হবে না।
- Different Strategies: Hibernate বিভিন্ন generation strategies সরবরাহ করে, যা আপনাকে বিভিন্ন ডেটাবেসের সাথে কাজ করার সময় প্রাথমিক কী তৈরি করার জন্য উপযুক্ত পদ্ধতি নির্বাচন করতে দেয়।
- Database Independence: Hibernate আপনাকে ডেটাবেসের সক্ষমতার উপর নির্ভর না করে ID generation পরিচালনা করতে সক্ষম করে, এটি আপনার অ্যাপ্লিকেশনকে database-independent করে তোলে।
Hibernate এ Primary Key এবং Generated Value ব্যবহারের মাধ্যমে ডেটাবেসে রেকর্ডের জন্য একটি ইউনিক আইডেন্টিফায়ার তৈরি করা হয়। @Id অ্যানোটেশনটি প্রাথমিক কী চিহ্নিত করার জন্য ব্যবহৃত হয় এবং @GeneratedValue এর মাধ্যমে সেই কীটি স্বয়ংক্রিয়ভাবে তৈরি করা হয়। Hibernate ব্যবহার করে আপনি ডেটাবেসের সাথে যুক্ত Java অ্যাপ্লিকেশনগুলিতে ডিপেন্ডেন্সি ইনজেকশন, পারফরম্যান্স অপটিমাইজেশন, এবং ডেটাবেস ইন্টিগ্রেশন সহজে এবং কার্যকরভাবে পরিচালনা করতে পারেন।
Read more