JPA (Java Persistence API) তে Composite Key হল একটি প্রক্রিয়া যেখানে একটি Entity এর প্রাইমারি কী (Primary Key) একাধিক ফিল্ডের সমন্বয়ে তৈরি করা হয়। এই ক্ষেত্রে, @EmbeddedId অ্যানোটেশন ব্যবহার করা হয় যখন একটি Entity এর প্রাইমারি কী হিসাবে একাধিক ফিল্ডের সমন্বয় দরকার।
Composite Key সাধারণত দুইটি বা তার বেশি কলামকে একত্রিত করে একটি সঠিক এবং স্বতন্ত্র শনাক্তকারী তৈরি করতে ব্যবহৃত হয়। JPA তে Composite Key এর জন্য @EmbeddedId ব্যবহার করা হয়, যা একটি ক্লাসের মধ্যে @IdClass অথবা @EmbeddedId আকারে প্রদান করা যায়।
@EmbeddedId এর ধারণা
@EmbeddedId হল একটি অ্যানোটেশন যা একটি এম্বেডেড প্রাইমারি কী ক্লাসের প্রতিনিধিত্ব করে, এবং এটি Entity ক্লাসের মধ্যে একটি ফিল্ড হিসেবে ব্যবহার করা হয়। এটি @Embeddable ক্লাস দ্বারা প্রতিনিধিত্ব করা হয়, যা বিভিন্ন প্রপার্টি (ফিল্ড) নিয়ে গঠিত একটি ক্লাস।
@EmbeddedId এবং @Embeddable এর মধ্যে সম্পর্ক
- @Embeddable: এটি একটি ক্লাসকে এম্বেডযোগ্য (embeddable) হিসেবে চিহ্নিত করে, যা অন্যান্য Entity ক্লাসে প্রাইমারি কী হিসেবে ব্যবহৃত হবে।
- @EmbeddedId: এটি Entity ক্লাসে ব্যবহার করা হয়, যেখানে প্রাইমারি কী একাধিক ফিল্ডের সমন্বয়ে তৈরি করা হয়।
Composite Key Mapping এর জন্য @EmbeddedId ব্যবহার করার উদাহরণ
Step 1: @Embeddable ক্লাস তৈরি করা
প্রথমে একটি ক্লাস তৈরি করতে হবে যেটি একাধিক ফিল্ড (যা প্রাইমারি কী হিসেবে ব্যবহার করা হবে) ধারণ করবে এবং এটিকে @Embeddable অ্যানোটেশন দিয়ে চিহ্নিত করতে হবে।
import javax.persistence.Embeddable;
@Embeddable
public class OrderId {
private Long orderId;
private Long productId;
// Default constructor, getter and setter methods
public OrderId() {}
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public Long getProductId() {
return productId;
}
public void setProductId(Long productId) {
this.productId = productId;
}
// Override equals() and hashCode() methods to ensure correct behavior
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
OrderId orderId1 = (OrderId) o;
return orderId.equals(orderId1.orderId) && productId.equals(orderId1.productId);
}
@Override
public int hashCode() {
return 31 * orderId.hashCode() + productId.hashCode();
}
}
এখানে, OrderId ক্লাসটি দুটি প্রপার্টি (orderId এবং productId) ধারণ করছে, যা একত্রে Order Entity এর প্রাইমারি কী হিসেবে ব্যবহৃত হবে।
Step 2: @EmbeddedId ব্যবহার করা
এখন, Order Entity ক্লাসে @EmbeddedId ব্যবহার করে OrderId ক্লাসটিকে প্রাইমারি কী হিসেবে যুক্ত করা হবে।
import javax.persistence.Entity;
import javax.persistence.EmbeddedId;
@Entity
public class Order {
@EmbeddedId
private OrderId id;
private String customerName;
private String orderDate;
// Default constructor, getter and setter methods
public Order() {}
public OrderId getId() {
return id;
}
public void setId(OrderId id) {
this.id = id;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getOrderDate() {
return orderDate;
}
public void setOrderDate(String orderDate) {
this.orderDate = orderDate;
}
}
এখানে, Order Entity ক্লাসে OrderId ক্লাসটি @EmbeddedId অ্যানোটেশন দিয়ে যুক্ত করা হয়েছে। এর ফলে, Order Entity এর প্রাইমারি কী হিসাবে orderId এবং productId দুটো ফিল্ড একত্রে ব্যবহৃত হবে।
@EmbeddedId এর কার্যকারিতা
- Composite Primary Key: @EmbeddedId ব্যবহার করে Entity তে একাধিক ফিল্ডের সমন্বয়ে প্রাইমারি কী তৈরি করা যায়।
- Object-Oriented Approach: এটি Object-Oriented Programming (OOP) ধারণায় সংহত হয়ে থাকে, যেখানে একটি ক্লাসের মাধ্যমে প্রাইমারি কী কাস্টমাইজ করা সম্ভব হয়।
- Reusability: @Embeddable ক্লাসটি অন্য Entity ক্লাসে ব্যবহার করা যেতে পারে, তাই কোড পুনঃব্যবহারযোগ্য হয়।
Database Table Structure
এটি সাধারণত একটি Order টেবিলের জন্য যেমন হতে পারে:
| order_id | product_id | customer_name | order_date |
|---|---|---|---|
| 1 | 101 | John Doe | 2024-01-01 |
| 2 | 102 | Jane Doe | 2024-02-01 |
এখানে, order_id এবং product_id একসাথে Composite Key হিসেবে কাজ করবে, এবং Order Entity এর OrderId ক্লাসের মাধ্যমে প্রাইমারি কী হিসেবে সংজ্ঞায়িত হবে।
@EmbeddedId এর সুবিধা:
- Object-Oriented Mapping:
- JPA তে Composite Key গুলোর জন্য Object-Oriented উপায় প্রদান করে, যা Entity ক্লাসের মধ্যেই প্রাইমারি কী তৈরি করে দেয়।
- Code Reusability:
- একটি @Embeddable ক্লাস তৈরি করে একাধিক Entity তে ব্যবহার করা সম্ভব, ফলে কোডের পুনঃব্যবহারযোগ্যতা বাড়ে।
- Complex Key Modeling:
- Composite Key এর জন্য একটি এলিগেন্ট এবং পরিষ্কার সমাধান প্রদান করে।
সার্বিক পর্যালোচনা
JPA তে @EmbeddedId একটি কার্যকরী উপায় যা Composite Primary Key ম্যানেজ করতে ব্যবহৃত হয়। এটি @Embeddable ক্লাসের মাধ্যমে একাধিক ফিল্ডকে প্রাইমারি কী হিসেবে একটি Entity তে সংজ্ঞায়িত করে, যা Java Object এবং Database Table এর মধ্যে সম্পর্ক তৈরিতে সহায়তা করে। @EmbeddedId ব্যবহার করার মাধ্যমে ডেভেলপাররা তাদের অ্যাপ্লিকেশনে complex key modeling সহজ এবং পরিষ্কারভাবে পরিচালনা করতে পারেন।
Read more