Hibernate-এ Global Query এবং Soft Delete Pattern দুটি সাধারণ এবং কার্যকর কৌশল যা ডেটাবেস অপারেশন এবং ডেটা ম্যানেজমেন্টের ক্ষেত্রে ব্যবহৃত হয়। এই কৌশলগুলি আপনাকে সহজে ডেটার উপর নিয়ন্ত্রণ রাখতে এবং অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে। নিচে এই দুটি কৌশল নিয়ে বিস্তারিত আলোচনা করা হয়েছে।
1. Global Query
Global Queries হাইবারনেটের এমন একটি কৌশল যা একাধিক Entity বা টেবিলের উপর একযোগে একটি সাধারণ ফিল্টার প্রয়োগ করে। সাধারণত এটি তখন ব্যবহৃত হয় যখন আপনি একটি সাধারণ শর্ত বা কন্ডিশন প্রতিটি কুয়েরিতে প্রযোজ্য করতে চান, যেমন সক্রিয় রেকর্ড বা মাল্টি-টেনেন্সি ডেটা পার্টিশনিং।
Hibernate Global Filters
Hibernate আপনাকে global filters ব্যবহার করার সুবিধা দেয়, যা স্বয়ংক্রিয়ভাবে নির্দিষ্ট কন্ডিশনগুলি সমস্ত কুয়েরির জন্য প্রয়োগ করে। সাধারণত, আপনি যদি soft delete এর মতো শর্তগুলি সব কুয়েরিতে অ্যাপ্লাই করতে চান, তাহলে global filter খুব উপকারী।
Step 1: Global Filter Enable করা
গ্লোবাল ফিল্টার সক্রিয় করতে, Hibernate কনফিগারেশন ফাইলে ফিল্টার সেটআপ করতে হয়, এবং এটি স্বয়ংক্রিয়ভাবে সংশ্লিষ্ট Entity-র সব কুয়েরিতে প্রয়োগ করা হবে।
import org.hibernate.Filter;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class GlobalQueryExample {
public static void main(String[] args) {
// SessionFactory তৈরি করা
SessionFactory sessionFactory = new Configuration().configure().addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = sessionFactory.openSession();
// Global filter সক্রিয় করা
session.enableFilter("softDeleteFilter").setParameter("isDeleted", false);
// কুয়েরি রান করা, যেখানে গ্লোবাল ফিল্টার স্বয়ংক্রিয়ভাবে প্রয়োগ হবে
List<Employee> employees = session.createQuery("from Employee", Employee.class).getResultList();
// ফলাফল প্রিন্ট করা
for (Employee employee : employees) {
System.out.println(employee.getName());
}
session.close();
sessionFactory.close();
}
}
Step 2: Entity Class-এ Global Filter Define করা
এখন, Entity ক্লাসে @Filter অ্যানোটেশন ব্যবহার করে ফিল্টার যুক্ত করতে হবে:
import org.hibernate.annotations.Filter;
import org.hibernate.annotations.FilterDef;
import org.hibernate.annotations.ParamDef;
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
@FilterDef(name = "softDeleteFilter", parameters = @ParamDef(name = "isDeleted", type = "boolean"))
@Filter(name = "softDeleteFilter", condition = "deleted = :isDeleted")
public class Employee {
@Id
private int id;
private String name;
private boolean deleted;
// Getters and Setters
}
এখানে:
@FilterDefএবং@Filterব্যবহার করে ফিল্টার সেট করা হয়েছে যা ডেটাবেস থেকে deleted মানের উপর ভিত্তি করে ডেটা ফিল্টার করবে।
Global Filter এর সুবিধা:
- Consistency: প্রতিটি কুয়েরিতে একই শর্ত প্রয়োগের সুবিধা।
- Flexibility: প্রয়োজনে আপনি ফিল্টার বন্ধ বা পরিবর্তন করতে পারবেন।
2. Soft Delete Pattern
Soft Delete Pattern এমন একটি কৌশল যেখানে আপনি ডেটাকে ফিজিক্যালি ডিলিট না করে, বরং লজিক্যালি মুছে ফেলেন। এর মাধ্যমে ডেটা সংরক্ষিত থাকে এবং আপনি যদি পরে সেই ডেটা পুনরুদ্ধার করতে চান, তাহলে তা সম্ভব হয়।
Hibernate-এ Soft Delete Pattern প্রয়োগ:
Hibernate-এ soft delete প্রক্রিয়া একটি deleted বা isDeleted ফিল্ড ব্যবহার করে করা হয়, যা নির্দেশ করে যে রেকর্ডটি "মুছে ফেলা" হয়েছে। এর মাধ্যমে, ডেটাবেসে রেকর্ডটি এখনও উপস্থিত থাকে, তবে এটি আর ব্যবহারকারী বা অ্যাপ্লিকেশন দ্বারা অ্যাক্সেসযোগ্য হয় না।
Step 1: Entity Class-এ Soft Delete ফিল্ড যোগ করা
import javax.persistence.Entity;
import javax.persistence.Id;
@Entity
public class Employee {
@Id
private int id;
private String name;
private boolean deleted = false; // Soft delete flag
// Getters and Setters
public boolean isDeleted() {
return deleted;
}
public void setDeleted(boolean deleted) {
this.deleted = deleted;
}
}
এখানে, deleted নামক একটি boolean ফিল্ড তৈরি করা হয়েছে, যা নির্দেশ করে যে রেকর্ডটি মুছে ফেলা হয়েছে।
Step 2: Soft Delete মেথড তৈরি করা
Soft Delete করতে, ডিলিট অপারেশন না করে deleted ফিল্ডটি true সেট করা হয়।
public class EmployeeDAO {
private SessionFactory sessionFactory;
public EmployeeDAO(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
public void softDeleteEmployee(int employeeId) {
Session session = sessionFactory.getCurrentSession();
Transaction transaction = session.beginTransaction();
try {
Employee employee = session.get(Employee.class, employeeId);
if (employee != null) {
employee.setDeleted(true); // Soft delete: Mark as deleted
session.update(employee); // Update the record
transaction.commit();
System.out.println("Employee marked as deleted.");
}
} catch (Exception e) {
if (transaction != null) {
transaction.rollback();
}
e.printStackTrace();
}
}
}
এখানে, softDeleteEmployee() মেথডে deleted ফিল্ডটি true করা হচ্ছে, যার ফলে এটি ডাটাবেসে soft delete হয়ে যাবে।
Step 3: Global Filter জন্য Soft Delete
যেহেতু আমরা deleted ফিল্ড ব্যবহার করে ডেটা মুছে ফেলি, এখন একটি global filter ব্যবহার করে এই ফিল্ডের ভিত্তিতে ডেটা ফিল্টার করা হবে।
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class MainApp {
public static void main(String[] args) {
SessionFactory sessionFactory = new Configuration().configure().addAnnotatedClass(Employee.class).buildSessionFactory();
Session session = sessionFactory.openSession();
session.enableFilter("softDeleteFilter").setParameter("isDeleted", false);
List<Employee> employees = session.createQuery("from Employee", Employee.class).getResultList();
for (Employee employee : employees) {
System.out.println(employee.getName());
}
session.close();
sessionFactory.close();
}
}
এখানে:
- Global Filter ব্যবহার করে আপনি ডিলিট হওয়া রেকর্ডগুলি ফিল্টার করছেন, যাতে এগুলো সাধারণ কুয়েরির মধ্যে অন্তর্ভুক্ত না হয়।
Soft Delete Pattern এর সুবিধা:
- Data Preservation: ডেটা হারিয়ে যায় না, এবং পরে পুনরুদ্ধার করা যেতে পারে।
- Audit: হারানো বা মুছে ফেলা ডেটা পরবর্তী সময়ে অডিট করতে পারে।
- Recovery: রেকর্ড পুনরুদ্ধার করা যায় যদি পরে প্রয়োজন হয়।
- Global Query এবং Soft Delete Pattern Hibernate-এ কার্যকরী কৌশল যা ডেটাবেস অপারেশন আরও মডুলার এবং মানানসই করে তোলে।
- Global Query ফিল্টারিং কৌশল ব্যবহার করে আপনি সহজেই ডেটার উপর শর্ত প্রয়োগ করতে পারেন।
- Soft Delete Pattern ডেটা হারানোর পরিবর্তে ডেটাকে লজিক্যালি মুছে ফেলে এবং প্রয়োজনে পুনরুদ্ধার করা যায়।
এই কৌশলগুলো আপনার Hibernate অ্যাপ্লিকেশনগুলিকে আরও স্কেলেবল, সুরক্ষিত এবং সুসংহত করতে সাহায্য করবে।
Read more