Hibernate-এ FetchType.LAZY এবং FetchType.EAGER হল দুটি fetching strategy যা সম্পর্কিত অ্যাসোসিয়েশন ( যেমন @OneToMany, @ManyToOne, @OneToOne, @ManyToMany) থেকে ডেটা লোড করার কৌশল নির্ধারণ করে।
FetchType.LAZY vs FetchType.EAGER
FetchType.LAZY:- এটি ডিফল্ট ফেচিং কৌশল, যা একমাত্র তখন ডেটা লোড করে যখন সম্পর্কিত অ্যাসোসিয়েশন অ্যাক্সেস করা হয়।
- Lazy loading এর মাধ্যমে, Hibernate সম্পর্কিত ডেটা ডেলিভারি দেরী করে অর্থাৎ ডেটা শুধুমাত্র তখন লোড করা হয় যখন প্রকৃতপক্ষে প্রয়োজন হবে।
- Performance: এটি কেবলমাত্র দরকারি ডেটার জন্য ডেটাবেস থেকে তথ্য আনে, ফলে কম ডেটা রিটার্ন করা হয় এবং performance উন্নত হয়।
FetchType.EAGER:- এটি সম্পর্কিত সব ডেটা তৎক্ষণাৎ লোড করে, যখন মূল অবজেক্টটি লোড হয়।
- Eager loading এর মাধ্যমে, Hibernate সম্পর্কিত সমস্ত ডেটা একসাথে লোড করে, এবং সাধারণত এটি বড় বা জটিল ডেটাবেস কুয়েরি সৃষ্টি করে।
- Performance: এটা অনেক বেশি ডেটা লোড করতে পারে, যার ফলে performance কমে যেতে পারে, কারণ একবারে বেশি ডেটা লোড হয় এবং ডাটাবেস থেকে আরো বড় কুয়েরি রান হয়।
FetchType.LAZY এবং FetchType.EAGER এর ব্যবহারের উদাহরণ
1. FetchType.LAZY ব্যবহার:
LAZY লোডিং হল ডিফল্ট কৌশল, যেখানে সম্পর্কিত অবজেক্ট শুধুমাত্র তখন লোড করা হয় যখন প্রয়োজন।
import javax.persistence.*;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY) // Lazy loading
private Set<Employee> employees;
// Getters and Setters
}
Employee Entity:
import javax.persistence.*;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToOne(fetch = FetchType.LAZY) // Lazy loading
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
এখানে:
@OneToMany(fetch = FetchType.LAZY):Departmentক্লাসের মধ্যেemployeesঅ্যাসোসিয়েশন lazy-loaded হবে, অর্থাৎ ডিপার্টমেন্ট অবজেক্ট লোড করার সময়employeesলোড করা হবে না। শুধুমাত্র যখনemployeesঅ্যাক্সেস করা হবে, তখনই ডেটা ডাটাবেস থেকে লোড হবে।@ManyToOne(fetch = FetchType.LAZY):Employeeক্লাসের মধ্যেdepartmentসম্পর্ক lazy-loaded হবে, অর্থাৎ যখনEmployeeঅবজেক্টটি লোড হবে, তখনdepartmentসম্পর্কিত ডেটা লোড হবে না, তবে যখনdepartmentঅ্যাক্সেস করা হবে, তখনই ডেটা লোড হবে।
2. FetchType.EAGER ব্যবহার:
EAGER লোডিং হল তখনই সম্পর্কিত ডেটা লোড করা হয়, যখন মূল অবজেক্ট লোড হয়।
import javax.persistence.*;
@Entity
public class Department {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@OneToMany(mappedBy = "department", fetch = FetchType.EAGER) // Eager loading
private Set<Employee> employees;
// Getters and Setters
}
Employee Entity:
import javax.persistence.*;
@Entity
public class Employee {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
@ManyToOne(fetch = FetchType.EAGER) // Eager loading
@JoinColumn(name = "department_id")
private Department department;
// Getters and Setters
}
এখানে:
@OneToMany(fetch = FetchType.EAGER):Departmentক্লাসের মধ্যেemployeesঅ্যাসোসিয়েশন eagerly লোড হবে, অর্থাৎ যখনDepartmentঅবজেক্টটি লোড হবে, তখন সঙ্গে সঙ্গেemployeesসম্পর্কিত সমস্ত ডেটা ডাটাবেস থেকে লোড হবে।@ManyToOne(fetch = FetchType.EAGER):Employeeক্লাসের মধ্যেdepartmentসম্পর্ক eagerly লোড হবে, অর্থাৎ যখনEmployeeঅবজেক্টটি লোড হবে, তখনdepartmentসম্পর্কিত ডেটা একসাথে লোড হবে।
3. Example: Eager vs Lazy Loading Performance Comparison
Scenario 1: Lazy Loading (Better Performance)
ধরা যাক, আপনি একটি Department অবজেক্ট লোড করছেন এবং শুধুমাত্র Department এর তথ্য দেখতে চান, কিন্তু employees টেবিলের তথ্য না। Lazy loading তখনই ডেটা লোড করবে যখন employees অ্যাক্সেস করা হবে।
Department department = session.get(Department.class, 1); // Only department info is loaded
System.out.println(department.getName()); // `employees` info is not loaded yet
এখানে:
- Performance: শুধুমাত্র
Departmentতথ্য লোড হয়েছে, এবংemployeesসম্পর্কিত ডেটা ডাটাবেস থেকে লোড করা হয়নি। শুধুমাত্র যখনemployeesঅ্যাক্সেস করা হবে, তখনই সেটা লোড হবে, যা পারফরম্যান্সের জন্য ভাল।
Scenario 2: Eager Loading (Slower Performance)
এখানে, Department এবং এর সমস্ত employees তথ্য একসাথে লোড হবে, যা বড় ডেটাসেটগুলির জন্য পারফরম্যান্স কমিয়ে দিতে পারে।
Department department = session.get(Department.class, 1); // Employees are also loaded
System.out.println(department.getEmployees()); // `employees` info is loaded with `Department`
এখানে:
- Performance:
Departmentএবংemployeesতথ্য উভয়ই ডেটাবেস থেকে একসাথে লোড হবে, যা অতিরিক্ত ডেটা লোডিং করতে পারে এবং পারফরম্যান্সে প্রভাব ফেলতে পারে, বিশেষ করে বড় ডেটাবেসে।
Summary of FetchType.LAZY vs FetchType.EAGER
| Aspect | FetchType.LAZY | FetchType.EAGER |
|---|---|---|
| Loading Behavior | Data is loaded only when accessed | Data is loaded immediately along with the parent |
| Performance | Better performance, less data fetched initially | Can lead to poor performance, more data fetched |
| Use Case | When you don't need the related data immediately | When you need the related data right away |
| Default in Hibernate | Default for most associations | Not default (except for some cases like @ManyToOne) |
| SQL Queries | Fewer queries initially, more when related data is accessed | More queries at once, can result in JOINs |
FetchType.LAZY এবং FetchType.EAGER দুটি Hibernate-এ সম্পর্কিত ডেটা লোড করার পদ্ধতি। Lazy loading পারফরম্যান্সের জন্য ভালো, কারণ এটি ডেটা শুধুমাত্র তখন লোড করে যখন প্রয়োজন হয়, তবে Eager loading তখন ব্যবহৃত হয় যখন আপনি সম্পর্কিত ডেটা একসাথে লোড করতে চান।
আপনার প্রজেক্টের প্রয়োজন অনুযায়ী আপনাকে সঠিক fetching strategy নির্বাচন করতে হবে। Lazy loading সাধারণত ভালো পারফরম্যান্স প্রদান করে, কিন্তু কিছু ক্ষেত্রে Eager loading প্রয়োজন হতে পারে।
Read more