Java Technologies FetchType.LAZY এবং FetchType.EAGER এর ব্যবহার গাইড ও নোট

369

Hibernate-এ FetchType.LAZY এবং FetchType.EAGER হল দুটি fetching strategy যা সম্পর্কিত অ্যাসোসিয়েশন ( যেমন @OneToMany, @ManyToOne, @OneToOne, @ManyToMany) থেকে ডেটা লোড করার কৌশল নির্ধারণ করে।

FetchType.LAZY vs FetchType.EAGER

  1. FetchType.LAZY:
    • এটি ডিফল্ট ফেচিং কৌশল, যা একমাত্র তখন ডেটা লোড করে যখন সম্পর্কিত অ্যাসোসিয়েশন অ্যাক্সেস করা হয়।
    • Lazy loading এর মাধ্যমে, Hibernate সম্পর্কিত ডেটা ডেলিভারি দেরী করে অর্থাৎ ডেটা শুধুমাত্র তখন লোড করা হয় যখন প্রকৃতপক্ষে প্রয়োজন হবে।
    • Performance: এটি কেবলমাত্র দরকারি ডেটার জন্য ডেটাবেস থেকে তথ্য আনে, ফলে কম ডেটা রিটার্ন করা হয় এবং performance উন্নত হয়।
  2. 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

AspectFetchType.LAZYFetchType.EAGER
Loading BehaviorData is loaded only when accessedData is loaded immediately along with the parent
PerformanceBetter performance, less data fetched initiallyCan lead to poor performance, more data fetched
Use CaseWhen you don't need the related data immediatelyWhen you need the related data right away
Default in HibernateDefault for most associationsNot default (except for some cases like @ManyToOne)
SQL QueriesFewer queries initially, more when related data is accessedMore queries at once, can result in JOINs

FetchType.LAZY এবং FetchType.EAGER দুটি Hibernate-এ সম্পর্কিত ডেটা লোড করার পদ্ধতি। Lazy loading পারফরম্যান্সের জন্য ভালো, কারণ এটি ডেটা শুধুমাত্র তখন লোড করে যখন প্রয়োজন হয়, তবে Eager loading তখন ব্যবহৃত হয় যখন আপনি সম্পর্কিত ডেটা একসাথে লোড করতে চান।

আপনার প্রজেক্টের প্রয়োজন অনুযায়ী আপনাকে সঠিক fetching strategy নির্বাচন করতে হবে। Lazy loading সাধারণত ভালো পারফরম্যান্স প্রদান করে, কিন্তু কিছু ক্ষেত্রে Eager loading প্রয়োজন হতে পারে।

Content added By
Promotion

Are you sure to start over?

Loading...