JPA (Java Persistence API) তে Embeddable হল একটি বিশেষ ধরনের Entity ক্লাস, যা Composite Attribute বা Value Object হিসেবে ব্যবহৃত হয়। এর মানে হলো, Embeddable ক্লাসটি একাধিক ফিল্ড সমন্বিত একটি গঠন বা অবজেক্ট হতে পারে যা একটি প্রধান Entity তে এম্বেড করা যাবে। এটি Entity এর মধ্যে পুনঃব্যবহারযোগ্য ডেটা কম্পোজিশন (composition) তৈরি করতে সাহায্য করে।
এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যখন আপনি বিভিন্ন প্রপার্টি বা ফিল্ডকে একত্রে একটি অবজেক্টের আকারে ব্যবহার করতে চান, যা পরে Entity তে এম্বেড করা যায়।
Embeddable এবং @Embedded এর ধারণা
- @Embeddable: এটি একটি ক্লাসের উপর ব্যবহার করা হয় যেটি অন্য Entity তে এম্বেড করা হবে। এটি সাধারণত সেগুলির জন্য ব্যবহৃত হয় যেগুলি Entity এর একটি অংশ হিসেবে কাজ করবে।
- @Embedded: এটি Entity ক্লাসের ভিতরে একটি Embeddable ক্লাস এম্বেড করতে ব্যবহৃত হয়।
Embeddable এর উদাহরণ
ধরা যাক, আমরা একটি Address নামক একটি ক্লাস তৈরি করতে চাই, যেখানে একটি Person Entity তে Address ফিল্ড হিসেবে এম্বেড করা হবে।
1. Embeddable Class (Address)
এটি একটি সাধারণ Embeddable ক্লাস, যা Street, City, এবং PostalCode ফিল্ড ধারণ করবে।
import javax.persistence.Embeddable;
@Embeddable
public class Address {
private String street;
private String city;
private String postalCode;
// Constructors
public Address() {
}
public Address(String street, String city, String postalCode) {
this.street = street;
this.city = city;
this.postalCode = postalCode;
}
// Getters and Setters
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getPostalCode() {
return postalCode;
}
public void setPostalCode(String postalCode) {
this.postalCode = postalCode;
}
}
এখানে, @Embeddable অ্যানোটেশন ব্যবহার করা হয়েছে, যা Address ক্লাসটিকে একটি এম্বেডেবল ক্লাস হিসাবে চিহ্নিত করে।
2. Main Entity Class (Person)
এখন, আমরা একটি Person Entity ক্লাস তৈরি করব, যেখানে Address ক্লাসটি @Embedded অ্যানোটেশন দিয়ে এম্বেড করা হবে।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Embedded;
@Entity
public class Person {
@Id
private Long id;
private String name;
@Embedded
private Address address; // Embedding Address as an embedded object
// Constructors
public Person() {
}
public Person(Long id, String name, Address address) {
this.id = id;
this.name = name;
this.address = address;
}
// Getters and Setters
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
}
এখানে:
- @Embedded অ্যানোটেশনটি Person Entity তে Address অবজেক্ট এম্বেড করেছে।
addressফিল্ডটি Address ক্লাসের অবজেক্ট হিসেবে ব্যবহৃত হচ্ছে।
3. Database Schema
JPA এই Embeddable ক্লাসের ফিল্ডগুলোকে Person টেবিলের কলাম হিসেবে এম্বেড করবে। ডেটাবেসে নিম্নরূপ একটি টেবিল তৈরি হবে:
| id | name | street | city | postalCode |
|---|---|---|---|---|
| 1 | John | Elm St. | Springfield | 12345 |
| 2 | Jane | Oak St. | Shelbyville | 67890 |
এখানে, street, city, এবং postalCode ফিল্ডগুলি ডেটাবেস টেবিলের কলাম হিসেবে থাকবে এবং Person Entity-তে Address অবজেক্টটি এম্বেড হবে।
4. Using the Entity and Embeddable Class
এখন, Person Entity তৈরি করতে, এবং Address ক্লাসের অবজেক্ট যোগ করতে পারেন।
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class Main {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("myJpaUnit");
EntityManager em = emf.createEntityManager();
// Creating a new Address
Address address = new Address("Elm St.", "Springfield", "12345");
// Creating a new Person and embedding Address
Person person = new Person(1L, "John", address);
// Persist the Person (and embedded Address)
em.getTransaction().begin();
em.persist(person);
em.getTransaction().commit();
// Retrieve the Person
Person retrievedPerson = em.find(Person.class, 1L);
System.out.println("Person: " + retrievedPerson.getName());
System.out.println("Address: " + retrievedPerson.getAddress().getStreet());
em.close();
emf.close();
}
}
এখানে:
PersonEntity তেAddressএম্বেড করা হয়েছে।em.persist(person)মাধ্যমে আমরাPersonEntity (এবং তার সাথে এম্বেড করাAddressঅবজেক্ট) ডেটাবেসে সেভ করেছি।
Embeddable এবং @Embedded এর সুবিধা:
- Code Reusability: একাধিক Entity ক্লাসে একই Embeddable অবজেক্ট ব্যবহার করা যায়।
- Improved Design: Entity ক্লাসগুলিতে উপযুক্ত কম্পোজিশন বজায় রেখে কোডের ডিজাইন উন্নত হয়।
- Data Encapsulation: Embeddable ক্লাসের মাধ্যমে ডেটা এনক্যাপসুলেশন সহজ হয়, এবং Entity ক্লাসের ভিতরে সংগঠিত ডেটা পরিচালনা করা যায়।
সারাংশ
JPA-তে Embeddable এবং @Embedded এর মাধ্যমে Entity তে অন্যান্য অবজেক্ট এম্বেড করা যায়, যা আপনার ডেটা মডেলকে আরো পরিষ্কার এবং পুনঃব্যবহারযোগ্য করে তোলে। Embeddable ক্লাস একাধিক ফিল্ড বা প্রপার্টি ধারণ করে এবং এটি Entity এর অংশ হিসেবে ব্যবহৃত হয়। এর মাধ্যমে ডেটাবেসের টেবিলের মধ্যে বিভিন্ন সম্পর্কিত ডেটা একত্রে সাজানো যায়। @Embedded অ্যানোটেশন Entity তে Embeddable ক্লাস এম্বেড করার জন্য ব্যবহৃত হয়।
Read more