JPA (Java Persistence API) হল একটি Java প্রযুক্তি যা ডেটাবেসে ডেটা সঞ্চয়, পুনরুদ্ধার এবং পরিচালনা করতে ব্যবহৃত হয়। JPA এর মাধ্যমে, আপনি আপনার অ্যাপ্লিকেশন ডোমেন মডেলকে ডেটাবেস টেবিলের মধ্যে ম্যাপ করতে পারেন। JPA তে Embeddable এবং Embedded Objects ব্যবহার করে আপনি অবজেক্ট-মডেল রিলেশনশিপ আরও নমনীয় এবং সংগঠিত করতে পারেন।
এটি সাধারণত ছোট, পুনঃব্যবহারযোগ্য, অথবা গঠনমূলক ডেটার অংশ হিসেবে ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি Address অবজেক্ট যেটি অনেক User অবজেক্টে পুনরায় ব্যবহৃত হতে পারে।
JPA-তে, যদি আপনার কোনো ডোমেন মডেল থাকে যা একাধিক Entity ক্লাসের মধ্যে শেয়ার করা দরকার (যেমন, Address, Phone, বা AddressBook), তাহলে Embeddable অ্যানোটেশন ব্যবহার করে আপনি সেই ডোমেন মডেলটি একটি শেয়ারযোগ্য অবজেক্টে রূপান্তর করতে পারেন।
Embeddable Object কে JPA Entity-তে @Embedded অ্যানোটেশন ব্যবহার করে এম্বেড করা হয়।
import javax.persistence.Embeddable;
@Embeddable
public class Address {
private String street;
private String city;
private String state;
private String zipCode;
// Getters and Setters
}
এখানে, Address ক্লাসটি Embeddable হিসাবে চিহ্নিত করা হয়েছে, যার মানে এটি অন্য Entity ক্লাসে অন্তর্ভুক্ত করা যাবে, কিন্তু এটি নিজস্ব একটি টেবিল বা সত্তা হিসাবে ডেটাবেসে থাকবে না।
Embedded Object হল এমন একটি অবজেক্ট যা Embeddable টাইপ হিসেবে ডিফাইন করা এবং অন্য কোনো Entity তে এম্বেড করা হয়। @Embedded অ্যানোটেশন ব্যবহার করে Embeddable অবজেক্টকে Entity ক্লাসে এম্বেড করা যায়।
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Embedded;
@Entity
public class User {
@Id
private Long id;
private String name;
@Embedded // Embedding Address object into User entity
private Address address;
// Getters and Setters
}
এখানে, User Entity ক্লাসে Address নামক Embeddable Object এম্বেড করা হয়েছে। @Embedded
অ্যানোটেশনটি Address অবজেক্টকে User Entity-তে অন্তর্ভুক্ত করার জন্য ব্যবহৃত হয়েছে।
বৈশিষ্ট্য | Embeddable | Embedded |
---|---|---|
ডিফাইনেশন | এটি একটি অবজেক্ট যেটি @Embeddable অ্যানোটেশন দিয়ে চিহ্নিত করা হয়। | এটি একটি Embeddable অবজেক্ট যা @Embedded অ্যানোটেশন দিয়ে অন্য Entity-তে এম্বেড করা হয়। |
ব্যবহার | Embeddable অবজেক্টকে অন্য Entity-তে এম্বেড করার জন্য প্রস্তুত করা হয়। | এটি Embeddable অবজেক্টকে অন্য Entity-তে বাস্তবায়িত করা হয়। |
অ্যানোটেশন | @Embeddable | @Embedded |
ডেটাবেস টেবিল | নিজস্ব ডেটাবেস টেবিল তৈরি হয় না, তবে অন্য Entity এর মধ্যে অন্তর্ভুক্ত হয়। | Embedded Object কোনো ডেটাবেস টেবিল তৈরি না করে, মূল Entity টেবিলে ফিল্ড হিসেবে থাকে। |
Embeddable এবং Embedded Objects JPA তে ডোমেন মডেল তৈরির একটি শক্তিশালী পদ্ধতি যা ডেটাবেসের টেবিলের মধ্যে সম্পর্কিত ডেটাকে একত্রিত এবং সহজভাবে পরিচালনা করার সুযোগ দেয়। Embeddable একটি ক্লাসকে ডিফাইন করে যা পরে অন্য Entity-তে Embedded হিসেবে অন্তর্ভুক্ত করা যায়। এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, মডেল সিম্প্লিফিকেশন এবং রক্ষণাবেক্ষণ সহজ হয়।
JPA (Java Persistence API) ব্যবহারের সময় ডেটাবেসের মধ্যে সম্পর্ক স্থাপন এবং ডেটার মডেলিং করতে @Embeddable
এবং @Embedded
এনোটেশন দুটি খুবই গুরুত্বপূর্ণ। এগুলি মূলত এম্বেডেড অবজেক্ট তৈরি করতে ব্যবহৃত হয়, যা একাধিক Entity তে পুনঃব্যবহারযোগ্য এবং ডেটাবেস টেবিলের কলাম হিসেবে অবজেক্টের মান সংরক্ষণ করতে সহায়তা করে।
@Embeddable
এনোটেশন@Embeddable
এনোটেশন ব্যবহার করে একটি ক্লাসকে এম্বেডেড অবজেক্ট হিসেবে চিহ্নিত করা হয়। যখন একটি Entity অন্য Entity এর মধ্যে একটি এম্বেডেড অবজেক্ট ধারণ করে, তখন সেই অবজেক্টের ফিল্ডগুলিকে মূল Entity এর টেবিলে কলাম হিসেবে ম্যাপ করা হয়। এটি মূলত ডেটাবেসের মধ্যে একটি টেবিলের অংশ হিসেবে একাধিক অ্যাট্রিবিউটের গুচ্ছ হিসেবে কাজ করে।
@Embeddable
এনোটেশন ক্লাসের উপরে ব্যবহার করা হয়, যেটি অন্য Entity তে @Embedded
এনোটেশন দ্বারা ব্যবহৃত হয়।
ধরা যাক, আমাদের একটি Address
ক্লাস আছে, যার মধ্যে street
, city
, zipCode
ফিল্ড রয়েছে, এবং এই Address
অবজেক্টটি আমরা Person
Entity তে এমবেড করতে চাই।
import javax.persistence.Embeddable;
@Embeddable
public class Address {
private String street;
private String city;
private String zipCode;
// 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 getZipCode() {
return zipCode;
}
public void setZipCode(String zipCode) {
this.zipCode = zipCode;
}
}
এখানে, Address
ক্লাসটি @Embeddable
অ্যানোটেশন দ্বারা চিহ্নিত করা হয়েছে, যা এটি Person
Entity তে এমবেড হতে সক্ষম হবে।
@Embedded
এনোটেশন@Embedded
এনোটেশন ব্যবহার করে @Embeddable
ক্লাসকে Entity ক্লাসে অন্তর্ভুক্ত (embed) করা হয়। যখন কোনো @Embeddable
ক্লাস একটি Entity তে এমবেড করা হয়, তখন তার ফিল্ডগুলো ডেটাবেস টেবিলের কলাম হিসেবে ব্যবহার করা হয়।
@Embedded
এনোটেশন ব্যবহার করে আপনি কোনো @Embeddable
ক্লাসকে Entity তে এমবেড করতে পারেন।
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; // Address অবজেক্টটি Embedded
// 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;
}
}
এখানে, Person
Entity তে Address
অবজেক্টটি @Embedded
এনোটেশন ব্যবহার করে অন্তর্ভুক্ত করা হয়েছে। ডেটাবেসে Person
টেবিলটি এখন address
এর কলামগুলিও ধারণ করবে, যেমন street
, city
, এবং zipCode
।
@Embeddable
এবং @Embedded
এর সুবিধাAddress
বা ContactDetails
এর মতো অবজেক্টগুলিকে প্রধান Entity ক্লাসের মধ্যে এমবেড করা যায়।@Embeddable
এবং @Embedded
ব্যবহার করে আপনি একটি Entity তে অনেকগুলো সম্পর্কিত ফিল্ড একত্রে সংরক্ষণ করতে পারবেন, যা ডেটাবেসের গঠন পরিষ্কার রাখবে।@Embeddable
এবং @Embedded
এর জন্য Additional Features@AttributeOverride
এবং @AssociationOverride
: যদি আপনি embedded অবজেক্টের কোনো প্রপার্টির নাম পরিবর্তন করতে চান, তবে আপনি @AttributeOverride
ব্যবহার করতে পারেন। এটি ডেটাবেসের কলামের নাম বা বৈশিষ্ট্য পরিবর্তন করতে সাহায্য করে।
উদাহরণ:
@Embedded
@AttributeOverride(name = "street", column = @Column(name = "address_line"))
private Address address;
এখানে, street
প্রপার্টির নাম address_line
নামে ডেটাবেস কলামে ম্যাপ করা হবে।
@ElementCollection
: যদি আপনার @Embeddable
ক্লাসে একটি লিস্ট বা সেট (যেমন ফোন নম্বর বা ঠিকানা) থাকে, তবে @ElementCollection
ব্যবহার করা যেতে পারে, যা একটি Collection
অবজেক্টকে Entity এর মধ্যে এমবেড করা হয়।@Embeddable
এবং @Embedded
JPA-তে অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং প্যাটার্নের সাথে ডেটাবেস টেবিলের কলামগুলিকে সম্পর্কিত করতে ব্যবহৃত হয়। @Embeddable
একটি ক্লাসকে এমবেডেড অবজেক্ট হিসেবে চিহ্নিত করে, এবং @Embedded
এই অবজেক্টটিকে Entity ক্লাসে অন্তর্ভুক্ত (embed) করে। এটি ডেটাবেস স্কিমা এবং কোডের রিডেবিলিটি এবং মেন্টেনেন্স সহজ করে, কারণ একাধিক বৈশিষ্ট্য একটি অবজেক্টে প্যাকেজ করা যায় এবং Entity ক্লাসে সহজে ব্যবহার করা যায়।
JPA (Java Persistence API) তে Composite Key হল একটি প্রক্রিয়া যেখানে একটি Entity এর প্রাইমারি কী (Primary Key) একাধিক ফিল্ডের সমন্বয়ে তৈরি করা হয়। এই ক্ষেত্রে, @EmbeddedId অ্যানোটেশন ব্যবহার করা হয় যখন একটি Entity এর প্রাইমারি কী হিসাবে একাধিক ফিল্ডের সমন্বয় দরকার।
Composite Key সাধারণত দুইটি বা তার বেশি কলামকে একত্রিত করে একটি সঠিক এবং স্বতন্ত্র শনাক্তকারী তৈরি করতে ব্যবহৃত হয়। JPA তে Composite Key এর জন্য @EmbeddedId ব্যবহার করা হয়, যা একটি ক্লাসের মধ্যে @IdClass অথবা @EmbeddedId আকারে প্রদান করা যায়।
@EmbeddedId হল একটি অ্যানোটেশন যা একটি এম্বেডেড প্রাইমারি কী ক্লাসের প্রতিনিধিত্ব করে, এবং এটি Entity ক্লাসের মধ্যে একটি ফিল্ড হিসেবে ব্যবহার করা হয়। এটি @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 এর প্রাইমারি কী হিসেবে ব্যবহৃত হবে।
এখন, 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
দুটো ফিল্ড একত্রে ব্যবহৃত হবে।
এটি সাধারণত একটি 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 ক্লাসের মাধ্যমে প্রাইমারি কী হিসেবে সংজ্ঞায়িত হবে।
JPA তে @EmbeddedId একটি কার্যকরী উপায় যা Composite Primary Key ম্যানেজ করতে ব্যবহৃত হয়। এটি @Embeddable ক্লাসের মাধ্যমে একাধিক ফিল্ডকে প্রাইমারি কী হিসেবে একটি Entity তে সংজ্ঞায়িত করে, যা Java Object এবং Database Table এর মধ্যে সম্পর্ক তৈরিতে সহায়তা করে। @EmbeddedId ব্যবহার করার মাধ্যমে ডেভেলপাররা তাদের অ্যাপ্লিকেশনে complex key modeling সহজ এবং পরিষ্কারভাবে পরিচালনা করতে পারেন।
JPA (Java Persistence API)-তে Value Objects এবং Complex Types Mapping হল দুইটি গুরুত্বপূর্ণ কনসেপ্ট যা Entity গুলির মধ্যে সম্পর্ক তৈরি এবং ডেটার ম্যানিপুলেশন সহজ করে। Value Objects মূলত ডেটার একটি অখণ্ড অংশ, যেটি নিজে কোনো ডেটাবেস টেবিলের প্রতিনিধিত্ব করে না, কিন্তু একটি Entity এর অংশ হিসেবে ব্যবহার করা হয়। অন্যদিকে, Complex Types ব্যবহার করে একাধিক প্রপার্টি বা সম্পর্কিত ডেটা একত্রিত করা যায়, যেগুলো Entity তে একটি একক প্রপার্টি হিসেবে অন্তর্ভুক্ত হয়।
এই গাইডে আমরা Value Objects এবং Complex Types এর জেপিএ (JPA) তে কীভাবে ম্যাপিং করা হয় এবং এগুলির ব্যবহার কিভাবে Entity গুলির মধ্যে সম্পর্ক এবং ডেটাবেস ডিজাইনে উন্নতি আনে তা নিয়ে আলোচনা করব।
Value Objects এমন অবজেক্ট যা সাধারণত একটি Entity এর প্রপার্টি হিসেবে ব্যবহৃত হয়। এগুলো শুধুমাত্র একটি মানের প্রতিনিধিত্ব করে এবং এগুলোর কোনো পৃথক জীবনচক্র বা আইডেন্টিটি থাকে না। যখন Value Object পরিবর্তিত হয়, তখন সেটি একটি নতুন অবজেক্ট হয়ে ওঠে। সাধারণত Value Objects অ্যাড্রেস, ফোন নম্বর, বা কোনো পরিমাপের মতো অবজেক্ট হতে পারে, যেখানে সেই আইটেমটির নিজস্ব আইডেন্টিটি গুরুত্বপূর্ণ নয়, শুধুমাত্র তার মান (value) গুরুত্বপূর্ণ।
ধরা যাক, আমাদের একটি Address Value Object রয়েছে, যা Employee Entity তে ব্যবহৃত হবে।
Address Value Object:
import javax.persistence.Embeddable;
@Embeddable // Marks this class as a value object
public class Address {
private String street;
private String city;
private String zipCode;
// Getters and Setters
}
এখানে, @Embeddable
অ্যানোটেশন ব্যবহার করা হয়েছে, যা Entity তে এটি value object হিসেবে অন্তর্ভুক্ত হওয়ার অনুমতি দেয়।
Employee Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Embedded;
@Entity
public class Employee {
@Id
private Long id;
private String name;
@Embedded // Indicates that the Address is a Value Object
private Address address; // Address is embedded in Employee
// Getters and Setters
}
Explanation:
Address
ক্লাসটি একটি Value Object হিসেবে চিহ্নিত করা হয়েছে।Address
ক্লাসটি একটি অংশ হিসেবে অন্তর্ভুক্ত করা হয়েছে। এখানে Address
Entity তে আলাদাভাবে টেবিল তৈরি হবে না, বরং Employee টেবিলের একটি অংশ হিসেবে সেভ হবে।Complex Types হল অবজেক্টের সমন্বয় যা একাধিক প্রপার্টি ধারণ করে এবং এটি Entity তে একটি একক প্রপার্টি হিসেবে ব্যবহার হয়। Complex Types Mapping ব্যবহার করা হয় যখন আপনি একটি Entity তে এমন একটি অবজেক্ট রাখতে চান যা একাধিক প্রপার্টি ধারণ করে, কিন্তু এটি Entity হিসেবে আলাদাভাবে ব্যবহৃত হবে না।
এটি @Embeddable এবং @Embedded অ্যানোটেশন ব্যবহার করে অর্জন করা হয়। যখন Complex Type মানে একটি একাধিক প্রপার্টি বিশিষ্ট অবজেক্ট Entity তে সংরক্ষণ করা হয়, তখন ডেটাবেস টেবিলের নতুন কলামগুলোর জন্য আলাদা প্রপার্টি তৈরি হয়।
ধরা যাক, আমাদের একটি Measurement Complex Type রয়েছে যা বিভিন্ন পরিমাপের একাধিক মান ধারণ করবে, যেমন weight
এবং height
।
Measurement Complex Type:
import javax.persistence.Embeddable;
@Embeddable
public class Measurement {
private double weight;
private double height;
// Getters and Setters
}
Product Entity:
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Embedded;
@Entity
public class Product {
@Id
private Long id;
private String name;
@Embedded // Indicates that Measurement is a Complex Type
private Measurement measurement; // Measurement is embedded in Product
// Getters and Setters
}
Explanation:
Measurement
ক্লাসটি Complex Type হিসেবে চিহ্নিত করা হয়েছে।Measurement
অবজেক্টটি একটি একক প্রপার্টি হিসেবে অন্তর্ভুক্ত করা হয়েছে। এখানে Measurement
Entity তে আলাদা টেবিল তৈরি হবে না, বরং Product টেবিলের অংশ হিসেবে সেভ হবে।Concept | Value Objects | Complex Types |
---|---|---|
Definition | অবজেক্ট যা শুধুমাত্র মানের প্রতিনিধিত্ব করে। | অবজেক্ট যা একাধিক প্রপার্টি ধারণ করে এবং Entity তে একটি প্রপার্টি হিসেবে অন্তর্ভুক্ত হয়। |
Usage | প্রপার্টি মানে পরিবর্তন হলে নতুন অবজেক্ট তৈরি হয়। | একাধিক মান একত্রিত করে Entity তে একটি প্রপার্টি হিসেবে ব্যবহার করা হয়। |
Identity | কোনো আলাদা আইডেন্টিটি থাকে না। | কোনো আলাদা আইডেন্টিটি থাকে না, তবে একাধিক প্রপার্টি থাকতে পারে। |
Persistence | Entity এর অংশ হিসেবে সেভ হয়। | Entity এর অংশ হিসেবে সেভ হয়, কিন্তু আলাদা কলামগুলোর জন্য মেপিং তৈরি হয়। |
JPA এর Value Objects এবং Complex Types ম্যানেজমেন্ট Entity Lifecycle এর সাথে সম্পর্কিত, কারণ যখন একটি Entity সেভ, আপডেট, বা মুছে ফেলা হয়, তখন এতে অন্তর্ভুক্ত Value Objects বা Complex Types এর অবস্থা (state) পরিবর্তন করা হয়। যদি আপনার Value Object বা Complex Type এর উপর কোনো নির্দিষ্ট অপারেশন করতে চান, যেমন কোনো প্রোপার্টি সেট করা বা ডিলিট করা, তবে তা Entity Lifecycle এর অংশ হিসেবে অটোমেটিক্যালি হ্যান্ডেল করা হয়।
Value Objects এবং Complex Types Mapping হল জেপিএ (JPA)-তে এমন গুরুত্বপূর্ণ কনসেপ্ট যা ডেটাবেসের টেবিলের মধ্যে একাধিক প্রপার্টি বা ডেটা ধারণ করার পদ্ধতি সরবরাহ করে।
@Embedded
অ্যানোটেশন ব্যবহার করে অন্তর্ভুক্ত করা হয়, এবং @Embeddable
অ্যানোটেশন দ্বারা এটি চিহ্নিত করা হয়।এগুলি Entity তে ডেটা অন্তর্ভুক্ত করার জন্য কার্যকরী কৌশল যা আপনার ডেটাবেস ডিজাইন এবং ডেটা ম্যানিপুলেশন প্রক্রিয়াকে সহজ ও কার্যকরী করে তোলে।
JPA (Java Persistence API) তে Embeddable হল একটি বিশেষ ধরনের Entity ক্লাস, যা Composite Attribute বা Value Object হিসেবে ব্যবহৃত হয়। এর মানে হলো, Embeddable ক্লাসটি একাধিক ফিল্ড সমন্বিত একটি গঠন বা অবজেক্ট হতে পারে যা একটি প্রধান Entity তে এম্বেড করা যাবে। এটি Entity এর মধ্যে পুনঃব্যবহারযোগ্য ডেটা কম্পোজিশন (composition) তৈরি করতে সাহায্য করে।
এটি এমন পরিস্থিতিতে ব্যবহৃত হয় যখন আপনি বিভিন্ন প্রপার্টি বা ফিল্ডকে একত্রে একটি অবজেক্টের আকারে ব্যবহার করতে চান, যা পরে Entity তে এম্বেড করা যায়।
ধরা যাক, আমরা একটি Address নামক একটি ক্লাস তৈরি করতে চাই, যেখানে একটি Person Entity তে 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
ক্লাসটিকে একটি এম্বেডেবল ক্লাস হিসাবে চিহ্নিত করে।
এখন, আমরা একটি 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;
}
}
এখানে:
address
ফিল্ডটি Address ক্লাসের অবজেক্ট হিসেবে ব্যবহৃত হচ্ছে।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 অবজেক্টটি এম্বেড হবে।
এখন, 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();
}
}
এখানে:
Person
Entity তে Address
এম্বেড করা হয়েছে।em.persist(person)
মাধ্যমে আমরা Person
Entity (এবং তার সাথে এম্বেড করা Address
অবজেক্ট) ডেটাবেসে সেভ করেছি।JPA-তে Embeddable
এবং @Embedded
এর মাধ্যমে Entity তে অন্যান্য অবজেক্ট এম্বেড করা যায়, যা আপনার ডেটা মডেলকে আরো পরিষ্কার এবং পুনঃব্যবহারযোগ্য করে তোলে। Embeddable ক্লাস একাধিক ফিল্ড বা প্রপার্টি ধারণ করে এবং এটি Entity এর অংশ হিসেবে ব্যবহৃত হয়। এর মাধ্যমে ডেটাবেসের টেবিলের মধ্যে বিভিন্ন সম্পর্কিত ডেটা একত্রে সাজানো যায়। @Embedded
অ্যানোটেশন Entity তে Embeddable ক্লাস এম্বেড করার জন্য ব্যবহৃত হয়।
Read more