Skill

Embeddable এবং Embedded Objects

Java Technologies - জেপিএ  (JPA)
157
157

JPA (Java Persistence API) হল একটি Java প্রযুক্তি যা ডেটাবেসে ডেটা সঞ্চয়, পুনরুদ্ধার এবং পরিচালনা করতে ব্যবহৃত হয়। JPA এর মাধ্যমে, আপনি আপনার অ্যাপ্লিকেশন ডোমেন মডেলকে ডেটাবেস টেবিলের মধ্যে ম্যাপ করতে পারেন। JPA তে Embeddable এবং Embedded Objects ব্যবহার করে আপনি অবজেক্ট-মডেল রিলেশনশিপ আরও নমনীয় এবং সংগঠিত করতে পারেন।

Embeddable এবং Embedded Objects কী?


  • Embeddable Object: একটি অবজেক্ট যা অন্য কোনো Entity-তে এম্বেড (অন্তর্ভুক্ত) করা যায়, কিন্তু তার নিজস্ব সত্তা (identity) বা টেবিলের জন্য আলাদা কোনো ডেটাবেস রেকর্ড থাকে না।
  • Embedded Object: এটি একটি Embeddable Object যার একটি ইনস্ট্যান্স Entity ক্লাসে এম্বেড করা হয়।

এটি সাধারণত ছোট, পুনঃব্যবহারযোগ্য, অথবা গঠনমূলক ডেটার অংশ হিসেবে ব্যবহার করা হয়। উদাহরণস্বরূপ, একটি Address অবজেক্ট যেটি অনেক User অবজেক্টে পুনরায় ব্যবহৃত হতে পারে।


Embeddable Object এর ব্যবহার


JPA-তে, যদি আপনার কোনো ডোমেন মডেল থাকে যা একাধিক Entity ক্লাসের মধ্যে শেয়ার করা দরকার (যেমন, Address, Phone, বা AddressBook), তাহলে Embeddable অ্যানোটেশন ব্যবহার করে আপনি সেই ডোমেন মডেলটি একটি শেয়ারযোগ্য অবজেক্টে রূপান্তর করতে পারেন।

Embeddable Object কে JPA Entity-তে @Embedded অ্যানোটেশন ব্যবহার করে এম্বেড করা হয়।

Embeddable Example:

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 এর ব্যবহার


Embedded Object হল এমন একটি অবজেক্ট যা Embeddable টাইপ হিসেবে ডিফাইন করা এবং অন্য কোনো Entity তে এম্বেড করা হয়। @Embedded অ্যানোটেশন ব্যবহার করে Embeddable অবজেক্টকে Entity ক্লাসে এম্বেড করা যায়।

Embedded Example:

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 Objects এর মধ্যে পার্থক্য


বৈশিষ্ট্যEmbeddableEmbedded
ডিফাইনেশনএটি একটি অবজেক্ট যেটি @Embeddable অ্যানোটেশন দিয়ে চিহ্নিত করা হয়।এটি একটি Embeddable অবজেক্ট যা @Embedded অ্যানোটেশন দিয়ে অন্য Entity-তে এম্বেড করা হয়।
ব্যবহারEmbeddable অবজেক্টকে অন্য Entity-তে এম্বেড করার জন্য প্রস্তুত করা হয়।এটি Embeddable অবজেক্টকে অন্য Entity-তে বাস্তবায়িত করা হয়।
অ্যানোটেশন@Embeddable@Embedded
ডেটাবেস টেবিলনিজস্ব ডেটাবেস টেবিল তৈরি হয় না, তবে অন্য Entity এর মধ্যে অন্তর্ভুক্ত হয়।Embedded Object কোনো ডেটাবেস টেবিল তৈরি না করে, মূল Entity টেবিলে ফিল্ড হিসেবে থাকে।

এম্বেডেবল অবজেক্টের ব্যবহার কেন গুরুত্বপূর্ণ?


  1. ডেটা পুনঃব্যবহারযোগ্যতা: যখন আপনার ছোট ছোট অবজেক্ট যেমন Address, Phone, Name ইত্যাদি একাধিক Entity ক্লাসের মধ্যে ভাগ করা দরকার হয়, তখন Embeddable Objects ব্যবহার করলে এই অবজেক্টগুলোকে একাধিক Entity-তে পুনঃব্যবহার করা যায়।
  2. ডেটা মডেল সিম্প্লিফিকেশন: JPA-তে Embeddable Objects ব্যবহার করে আপনি আপনার ডোমেন মডেলকে সহজ, পরিষ্কার এবং কমপ্যাক্ট করতে পারেন, কারণ আপনি একই অবজেক্টকে একাধিক Entity-তে অন্তর্ভুক্ত করতে পারেন।
  3. অ্যাপ্লিকেশন রক্ষণাবেক্ষণ: যদি কোন একটি কম্পোনেন্টের মধ্যে পরিবর্তন করতে হয়, যেমন Address অবজেক্টের ক্ষেত্রে, তবে এটি শুধুমাত্র Embeddable Object তে পরিবর্তন করলে, সব স্থানে তা সঠিকভাবে আপডেট হয়ে যাবে।
  4. কোড রিডেবিলিটি: যখন আপনার কোডে একই ধরনের প্রোপার্টি অনেক Entity ক্লাসে ব্যবহার হচ্ছে, তখন Embeddable Objects ব্যবহার করে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি করা সম্ভব।

সারাংশ


Embeddable এবং Embedded Objects JPA তে ডোমেন মডেল তৈরির একটি শক্তিশালী পদ্ধতি যা ডেটাবেসের টেবিলের মধ্যে সম্পর্কিত ডেটাকে একত্রিত এবং সহজভাবে পরিচালনা করার সুযোগ দেয়। Embeddable একটি ক্লাসকে ডিফাইন করে যা পরে অন্য Entity-তে Embedded হিসেবে অন্তর্ভুক্ত করা যায়। এর মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা, মডেল সিম্প্লিফিকেশন এবং রক্ষণাবেক্ষণ সহজ হয়।

Content added By

@Embeddable এবং @Embedded এনোটেশন এর ব্যবহার

92
92

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 এর সুবিধা


  1. ডেটাবেসের স্ট্রাকচার পরিষ্কার করা: একাধিক ফিল্ডগুলিকে একটি অবজেক্টে প্যাকেজ করা সহজ হয়, যেমন Address বা ContactDetails এর মতো অবজেক্টগুলিকে প্রধান Entity ক্লাসের মধ্যে এমবেড করা যায়।
  2. কোড রিডেবিলিটি বৃদ্ধি: বিভিন্ন ক্ষেত্রের মানগুলোকে একত্রে রাখার মাধ্যমে কোডের পুনঃব্যবহারযোগ্যতা বৃদ্ধি পায়, যা ক্লাস এবং কোডের রিডেবিলিটি উন্নত করে।
  3. ডেটাবেস স্টোরেজ অপটিমাইজেশন: Embedded Objects ডেটাবেস টেবিলের কলাম হিসেবে সংরক্ষিত হলে, আপনার ডেটাবেস স্কিমা কমপ্লেক্স হবে না, তবে প্রয়োজনীয় সব ফিল্ডের তথ্য সেভ রাখা যাবে।
  4. পরিষ্কার এবং অভ্যন্তরীণ সম্পর্ক তৈরি করা: @Embeddable এবং @Embedded ব্যবহার করে আপনি একটি Entity তে অনেকগুলো সম্পর্কিত ফিল্ড একত্রে সংরক্ষণ করতে পারবেন, যা ডেটাবেসের গঠন পরিষ্কার রাখবে।

@Embeddable এবং @Embedded এর জন্য Additional Features


  1. @AttributeOverride এবং @AssociationOverride: যদি আপনি embedded অবজেক্টের কোনো প্রপার্টির নাম পরিবর্তন করতে চান, তবে আপনি @AttributeOverride ব্যবহার করতে পারেন। এটি ডেটাবেসের কলামের নাম বা বৈশিষ্ট্য পরিবর্তন করতে সাহায্য করে।

    উদাহরণ:

    @Embedded
    @AttributeOverride(name = "street", column = @Column(name = "address_line"))
    private Address address;
    

    এখানে, street প্রপার্টির নাম address_line নামে ডেটাবেস কলামে ম্যাপ করা হবে।

  2. @ElementCollection: যদি আপনার @Embeddable ক্লাসে একটি লিস্ট বা সেট (যেমন ফোন নম্বর বা ঠিকানা) থাকে, তবে @ElementCollection ব্যবহার করা যেতে পারে, যা একটি Collection অবজেক্টকে Entity এর মধ্যে এমবেড করা হয়।

সারাংশ


@Embeddable এবং @Embedded JPA-তে অবজেক্ট-অরিয়েন্টেড প্রোগ্রামিং প্যাটার্নের সাথে ডেটাবেস টেবিলের কলামগুলিকে সম্পর্কিত করতে ব্যবহৃত হয়। @Embeddable একটি ক্লাসকে এমবেডেড অবজেক্ট হিসেবে চিহ্নিত করে, এবং @Embedded এই অবজেক্টটিকে Entity ক্লাসে অন্তর্ভুক্ত (embed) করে। এটি ডেটাবেস স্কিমা এবং কোডের রিডেবিলিটি এবং মেন্টেনেন্স সহজ করে, কারণ একাধিক বৈশিষ্ট্য একটি অবজেক্টে প্যাকেজ করা যায় এবং Entity ক্লাসে সহজে ব্যবহার করা যায়।

Content added By

Composite Key Mapping এর জন্য @EmbeddedId ব্যবহার করা

197
197

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_idproduct_idcustomer_nameorder_date
1101John Doe2024-01-01
2102Jane Doe2024-02-01

এখানে, order_id এবং product_id একসাথে Composite Key হিসেবে কাজ করবে, এবং Order Entity এর OrderId ক্লাসের মাধ্যমে প্রাইমারি কী হিসেবে সংজ্ঞায়িত হবে।


@EmbeddedId এর সুবিধা:

  1. Object-Oriented Mapping:
    • JPA তে Composite Key গুলোর জন্য Object-Oriented উপায় প্রদান করে, যা Entity ক্লাসের মধ্যেই প্রাইমারি কী তৈরি করে দেয়।
  2. Code Reusability:
    • একটি @Embeddable ক্লাস তৈরি করে একাধিক Entity তে ব্যবহার করা সম্ভব, ফলে কোডের পুনঃব্যবহারযোগ্যতা বাড়ে।
  3. Complex Key Modeling:
    • Composite Key এর জন্য একটি এলিগেন্ট এবং পরিষ্কার সমাধান প্রদান করে।

সার্বিক পর্যালোচনা


JPA তে @EmbeddedId একটি কার্যকরী উপায় যা Composite Primary Key ম্যানেজ করতে ব্যবহৃত হয়। এটি @Embeddable ক্লাসের মাধ্যমে একাধিক ফিল্ডকে প্রাইমারি কী হিসেবে একটি Entity তে সংজ্ঞায়িত করে, যা Java Object এবং Database Table এর মধ্যে সম্পর্ক তৈরিতে সহায়তা করে। @EmbeddedId ব্যবহার করার মাধ্যমে ডেভেলপাররা তাদের অ্যাপ্লিকেশনে complex key modeling সহজ এবং পরিষ্কারভাবে পরিচালনা করতে পারেন।

Content added By

Value Objects এবং Complex Types Mapping

110
110

JPA (Java Persistence API)-তে Value Objects এবং Complex Types Mapping হল দুইটি গুরুত্বপূর্ণ কনসেপ্ট যা Entity গুলির মধ্যে সম্পর্ক তৈরি এবং ডেটার ম্যানিপুলেশন সহজ করে। Value Objects মূলত ডেটার একটি অখণ্ড অংশ, যেটি নিজে কোনো ডেটাবেস টেবিলের প্রতিনিধিত্ব করে না, কিন্তু একটি Entity এর অংশ হিসেবে ব্যবহার করা হয়। অন্যদিকে, Complex Types ব্যবহার করে একাধিক প্রপার্টি বা সম্পর্কিত ডেটা একত্রিত করা যায়, যেগুলো Entity তে একটি একক প্রপার্টি হিসেবে অন্তর্ভুক্ত হয়।

এই গাইডে আমরা Value Objects এবং Complex Types এর জেপিএ (JPA) তে কীভাবে ম্যাপিং করা হয় এবং এগুলির ব্যবহার কিভাবে Entity গুলির মধ্যে সম্পর্ক এবং ডেটাবেস ডিজাইনে উন্নতি আনে তা নিয়ে আলোচনা করব।


১. Value Objects

Value Objects এমন অবজেক্ট যা সাধারণত একটি Entity এর প্রপার্টি হিসেবে ব্যবহৃত হয়। এগুলো শুধুমাত্র একটি মানের প্রতিনিধিত্ব করে এবং এগুলোর কোনো পৃথক জীবনচক্র বা আইডেন্টিটি থাকে না। যখন Value Object পরিবর্তিত হয়, তখন সেটি একটি নতুন অবজেক্ট হয়ে ওঠে। সাধারণত Value Objects অ্যাড্রেস, ফোন নম্বর, বা কোনো পরিমাপের মতো অবজেক্ট হতে পারে, যেখানে সেই আইটেমটির নিজস্ব আইডেন্টিটি গুরুত্বপূর্ণ নয়, শুধুমাত্র তার মান (value) গুরুত্বপূর্ণ।

Value Object উদাহরণ:

ধরা যাক, আমাদের একটি 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:

  • @Embeddable: Address ক্লাসটি একটি Value Object হিসেবে চিহ্নিত করা হয়েছে।
  • @Embedded: Employee Entity তে Address ক্লাসটি একটি অংশ হিসেবে অন্তর্ভুক্ত করা হয়েছে। এখানে Address Entity তে আলাদাভাবে টেবিল তৈরি হবে না, বরং Employee টেবিলের একটি অংশ হিসেবে সেভ হবে।

২. Complex Types Mapping

Complex Types হল অবজেক্টের সমন্বয় যা একাধিক প্রপার্টি ধারণ করে এবং এটি Entity তে একটি একক প্রপার্টি হিসেবে ব্যবহার হয়। Complex Types Mapping ব্যবহার করা হয় যখন আপনি একটি Entity তে এমন একটি অবজেক্ট রাখতে চান যা একাধিক প্রপার্টি ধারণ করে, কিন্তু এটি Entity হিসেবে আলাদাভাবে ব্যবহৃত হবে না।

এটি @Embeddable এবং @Embedded অ্যানোটেশন ব্যবহার করে অর্জন করা হয়। যখন Complex Type মানে একটি একাধিক প্রপার্টি বিশিষ্ট অবজেক্ট Entity তে সংরক্ষণ করা হয়, তখন ডেটাবেস টেবিলের নতুন কলামগুলোর জন্য আলাদা প্রপার্টি তৈরি হয়।

Complex Type উদাহরণ:

ধরা যাক, আমাদের একটি 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:

  • @Embeddable: Measurement ক্লাসটি Complex Type হিসেবে চিহ্নিত করা হয়েছে।
  • @Embedded: Product Entity তে Measurement অবজেক্টটি একটি একক প্রপার্টি হিসেবে অন্তর্ভুক্ত করা হয়েছে। এখানে Measurement Entity তে আলাদা টেবিল তৈরি হবে না, বরং Product টেবিলের অংশ হিসেবে সেভ হবে।

৩. Value Objects এবং Complex Types এর পার্থক্য

ConceptValue ObjectsComplex Types
Definitionঅবজেক্ট যা শুধুমাত্র মানের প্রতিনিধিত্ব করে।অবজেক্ট যা একাধিক প্রপার্টি ধারণ করে এবং Entity তে একটি প্রপার্টি হিসেবে অন্তর্ভুক্ত হয়।
Usageপ্রপার্টি মানে পরিবর্তন হলে নতুন অবজেক্ট তৈরি হয়।একাধিক মান একত্রিত করে Entity তে একটি প্রপার্টি হিসেবে ব্যবহার করা হয়।
Identityকোনো আলাদা আইডেন্টিটি থাকে না।কোনো আলাদা আইডেন্টিটি থাকে না, তবে একাধিক প্রপার্টি থাকতে পারে।
PersistenceEntity এর অংশ হিসেবে সেভ হয়।Entity এর অংশ হিসেবে সেভ হয়, কিন্তু আলাদা কলামগুলোর জন্য মেপিং তৈরি হয়।

৪. @Embeddable এবং @Embedded এর ব্যবহার

  • @Embeddable: এটি ক্লাসের উপরে প্রয়োগ করা হয় এবং এটি Entity তে ব্যবহৃত Complex Types বা Value Objects এর জন্য সিগন্যাল দেয়।
  • @Embedded: এটি Entity এর প্রপার্টি হিসাবে Value Object বা Complex Type ব্যবহার করতে প্রয়োগ করা হয়।

Entity Lifecycle and Mapping

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)-তে এমন গুরুত্বপূর্ণ কনসেপ্ট যা ডেটাবেসের টেবিলের মধ্যে একাধিক প্রপার্টি বা ডেটা ধারণ করার পদ্ধতি সরবরাহ করে।

  • Value Objects সাধারণত Entity তে @Embedded অ্যানোটেশন ব্যবহার করে অন্তর্ভুক্ত করা হয়, এবং @Embeddable অ্যানোটেশন দ্বারা এটি চিহ্নিত করা হয়।
  • Complex Types একাধিক প্রপার্টি ধারণ করে এবং Entity তে একটি প্রপার্টি হিসেবে ব্যবহার হয়।

এগুলি Entity তে ডেটা অন্তর্ভুক্ত করার জন্য কার্যকরী কৌশল যা আপনার ডেটাবেস ডিজাইন এবং ডেটা ম্যানিপুলেশন প্রক্রিয়াকে সহজ ও কার্যকরী করে তোলে।

Content added By

Embeddable এর জন্য বাস্তব উদাহরণ

90
90

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 টেবিলের কলাম হিসেবে এম্বেড করবে। ডেটাবেসে নিম্নরূপ একটি টেবিল তৈরি হবে:

idnamestreetcitypostalCode
1JohnElm St.Springfield12345
2JaneOak St.Shelbyville67890

এখানে, 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();
    }
}

এখানে:

  • Person Entity তে Address এম্বেড করা হয়েছে।
  • em.persist(person) মাধ্যমে আমরা Person Entity (এবং তার সাথে এম্বেড করা Address অবজেক্ট) ডেটাবেসে সেভ করেছি।

Embeddable এবং @Embedded এর সুবিধা:

  1. Code Reusability: একাধিক Entity ক্লাসে একই Embeddable অবজেক্ট ব্যবহার করা যায়।
  2. Improved Design: Entity ক্লাসগুলিতে উপযুক্ত কম্পোজিশন বজায় রেখে কোডের ডিজাইন উন্নত হয়।
  3. Data Encapsulation: Embeddable ক্লাসের মাধ্যমে ডেটা এনক্যাপসুলেশন সহজ হয়, এবং Entity ক্লাসের ভিতরে সংগঠিত ডেটা পরিচালনা করা যায়।

সারাংশ


JPA-তে Embeddable এবং @Embedded এর মাধ্যমে Entity তে অন্যান্য অবজেক্ট এম্বেড করা যায়, যা আপনার ডেটা মডেলকে আরো পরিষ্কার এবং পুনঃব্যবহারযোগ্য করে তোলে। Embeddable ক্লাস একাধিক ফিল্ড বা প্রপার্টি ধারণ করে এবং এটি Entity এর অংশ হিসেবে ব্যবহৃত হয়। এর মাধ্যমে ডেটাবেসের টেবিলের মধ্যে বিভিন্ন সম্পর্কিত ডেটা একত্রে সাজানো যায়। @Embedded অ্যানোটেশন Entity তে Embeddable ক্লাস এম্বেড করার জন্য ব্যবহৃত হয়।

Content added By
Promotion