JPA (Java Persistence API) Entity এর জীবনচক্রের বিভিন্ন পর্যায়ে বিশেষ অপারেশন এবং কার্যক্রম পরিচালনা করতে সক্ষম। এটি Entity এর সৃষ্টির আগে এবং পরে, ডাটাবেসে সেভ হওয়া, আপডেট হওয়া বা মুছে ফেলার আগে ও পরে বিভিন্ন ইভেন্ট ট্রিগার করে। এই ইভেন্টগুলো হল Lifecycle Events, যা Entity তে কিছু নির্দিষ্ট কাজের আগে বা পরে চলতে পারে।
Lifecycle Events Overview
JPA Entity Lifecycle Events সাধারণত Callback Methods হিসেবে পরিচিত। এগুলো কিছু নির্দিষ্ট মেথড যা Entity এর জীবনচক্রের বিভিন্ন পর্যায়ে (যেমন, Entity তৈরি, persist, update, remove) ট্রিগার হয়। এই মেথডগুলো @PrePersist, @PostPersist, @PreUpdate, @PostUpdate, @PreRemove, এবং @PostRemove অ্যানোটেশন দ্বারা চিহ্নিত করা হয়।
Entity Lifecycle Event এর ধাপসমূহ
- @PrePersist: Entity অবজেক্টটি ডেটাবেসে সেভ হওয়ার আগে ট্রিগার হয়। সাধারণত এখানে Entity অবজেক্টের প্রাথমিক সেটিংস বা প্রস্তুতি নেওয়া হয়।
- @PostPersist: Entity অবজেক্টটি ডেটাবেসে সেভ হওয়ার পরে ট্রিগার হয়।
- @PreUpdate: Entity অবজেক্টটি আপডেট হওয়ার আগে ট্রিগার হয়।
- @PostUpdate: Entity অবজেক্টটি আপডেট হওয়ার পরে ট্রিগার হয়।
- @PreRemove: Entity অবজেক্টটি ডিলিট হওয়ার আগে ট্রিগার হয়।
- @PostRemove: Entity অবজেক্টটি ডিলিট হওয়ার পরে ট্রিগার হয়।
- @PostLoad: Entity অবজেক্টটি ডেটাবেস থেকে লোড হওয়ার পরে ট্রিগার হয়।
Callback Methods এর উদাহরণ
1. @PrePersist এবং @PostPersist
এখন আমরা একটি Entity তে @PrePersist এবং @PostPersist ব্যবহারের মাধ্যমে Entity তৈরির আগে এবং পরে কিছু অপারেশন সম্পন্ন করার উদাহরণ দেখব।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.PrePersist;
import javax.persistence.PostPersist;
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
@PrePersist
public void beforePersist() {
// Do something before persisting the entity
System.out.println("Before Persist: Product is about to be persisted");
}
@PostPersist
public void afterPersist() {
// Do something after persisting the entity
System.out.println("After Persist: Product has been persisted");
}
// Getters and Setters
}
Explanation:
- @PrePersist: এটি
beforePersistমেথডটি EntityProductসেভ হওয়ার আগে ট্রিগার করবে। - @PostPersist: এটি
afterPersistমেথডটি Entity সেভ হওয়ার পরে ট্রিগার করবে।
2. @PreUpdate এবং @PostUpdate
এই ইভেন্টগুলো Entity আপডেট হওয়ার আগে এবং পরে ট্রিগার হয়। এটি সাধারণত ডেটা পরিবর্তন করার পূর্বে বা পরে কোনো প্রক্রিয়া পরিচালনা করতে ব্যবহৃত হয়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.PreUpdate;
import javax.persistence.PostUpdate;
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
@PreUpdate
public void beforeUpdate() {
// Do something before updating the entity
System.out.println("Before Update: Product is about to be updated");
}
@PostUpdate
public void afterUpdate() {
// Do something after updating the entity
System.out.println("After Update: Product has been updated");
}
// Getters and Setters
}
Explanation:
- @PreUpdate: এটি
beforeUpdateমেথডটি Entity আপডেট হওয়ার আগে ট্রিগার করবে। - @PostUpdate: এটি
afterUpdateমেথডটি Entity আপডেট হওয়ার পরে ট্রিগার করবে।
3. @PreRemove এবং @PostRemove
@PreRemove এবং @PostRemove ইভেন্টগুলো Entity মুছে ফেলার আগে এবং পরে ট্রিগার হয়। এগুলো Entity ডিলিট হওয়ার পূর্বে এবং পরে কিছু প্রক্রিয়া চালানোর জন্য ব্যবহৃত হয়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.PreRemove;
import javax.persistence.PostRemove;
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
@PreRemove
public void beforeRemove() {
// Do something before removing the entity
System.out.println("Before Remove: Product is about to be removed");
}
@PostRemove
public void afterRemove() {
// Do something after removing the entity
System.out.println("After Remove: Product has been removed");
}
// Getters and Setters
}
Explanation:
- @PreRemove: এটি
beforeRemoveমেথডটি Entity মুছে ফেলার আগে ট্রিগার করবে। - @PostRemove: এটি
afterRemoveমেথডটি Entity মুছে ফেলার পরে ট্রিগার করবে।
4. @PostLoad
এই ইভেন্টটি তখন ট্রিগার হয় যখন Entity ডেটাবেস থেকে লোড করা হয়। এটি সাধারণত Entity এর উপর কিছু প্রক্রিয়া শুরু করার জন্য ব্যবহৃত হয়, যেমন কিছু ফিল্ড আপডেট করা বা লগিং।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.PostLoad;
@Entity
public class Product {
@Id
private Long id;
private String name;
private double price;
@PostLoad
public void afterLoad() {
// Do something after loading the entity
System.out.println("After Load: Product has been loaded from the database");
}
// Getters and Setters
}
Explanation:
- @PostLoad: এটি
afterLoadমেথডটি Entity ডেটাবেস থেকে লোড হওয়ার পরে ট্রিগার করবে।
Entity Lifecycle Management with @EntityListeners
JPA তে, আপনি একটি listener class তৈরি করতে পারেন যা Entity এর lifecycle events এর জন্য ইভেন্ট হ্যান্ডলার হিসেবে কাজ করবে। আপনি @EntityListeners অ্যানোটেশন ব্যবহার করে একটি listener ক্লাস যুক্ত করতে পারেন।
@EntityListeners উদাহরণ:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.EntityListeners;
import javax.persistence.PrePersist;
@Entity
@EntityListeners(ProductListener.class)
public class Product {
@Id
private Long id;
private String name;
private double price;
// Getters and Setters
}
import javax.persistence.PrePersist;
public class ProductListener {
@PrePersist
public void beforePersist(Product product) {
// Perform actions before Product entity is persisted
System.out.println("Listener: Before Persisting Product - " + product.getName());
}
}
Explanation:
- @EntityListeners(ProductListener.class): এটি Entity এর ProductListener ক্লাসের মেথডগুলোকে ট্রিগার করবে।
- @PrePersist: Listener ক্লাসে beforePersist মেথডটি Entity সেভ হওয়ার আগে ট্রিগার হবে।
সারাংশ
JPA Lifecycle Events এবং Callback Methods JPA Entity এর lifecycle এর বিভিন্ন পর্যায়ে Entity উপর অপারেশন পরিচালনা করতে ব্যবহৃত হয়। আপনি @PrePersist, @PostPersist, @PreUpdate, @PostUpdate, @PreRemove, @PostRemove, এবং @PostLoad অ্যানোটেশন ব্যবহার করে Entity এর সৃষ্টির আগে, আপডেটের আগে, ডিলিটের আগে, অথবা Entity লোড হওয়ার পরে কিছু কাস্টম কার্যক্রম সম্পাদন করতে পারেন।
- @PrePersist: Entity সেভ হওয়ার আগে
- @PostPersist: Entity সেভ হওয়ার পরে
- @PreUpdate: Entity আপডেট হওয়ার আগে
- @PostUpdate: Entity আপডেট হওয়ার পরে
- @PreRemove: Entity ডিলিট হওয়ার আগে
- @PostRemove: Entity ডিলিট হওয়ার পরে
- @PostLoad: Entity লোড হওয়ার পরে
এগুলি ব্যবহারের মাধ্যমে আপনি আপনার Entity-এর lifecycle events এর উপর ভিত্তি করে ডেটাবেসের অপারেশনগুলি আরও কার্যকরীভাবে পরিচালনা করতে পারেন।
Read more