Nested Beans Handling (নেস্টেড বিন হ্যান্ডলিং)

জাভা বীনইউটিলস (Java BeanUtils) - Computer Programming

337

Nested Beans Handling হল এমন একটি প্রক্রিয়া যেখানে একটি Java Bean (এটি একটি মডেল অবজেক্ট) অন্য একটি Bean কে একটি প্রপার্টি হিসেবে ধারণ করে। এই ধরনের nested relationships সাধারণত ডেটাবেসের টেবিলের মধ্যে একাধিক সম্পর্কের (one-to-many, many-to-one, etc.) প্রক্ষেপণ হিসেবে দেখা যায়, যেখানে একটি Bean অন্য Bean এর একটি প্রপার্টি হিসেবে উপস্থিত থাকে। Spring MVC, BeanUtils, Hibernate, JPA ইত্যাদি ফ্রেমওয়ার্কে nested beans ব্যবহৃত হয়।

নেস্টেড বিনে Bean এর মধ্যে অন্য Bean এর ডেটা ধারণ করা এবং সঠিকভাবে data binding এবং validation হ্যান্ডেল করা গুরুত্বপূর্ণ।

Nested Beans Handling in Java

নেস্টেড Beans হ্যান্ডলিং করতে সাধারণত দুটি প্রধান কাজ করতে হয়:

  1. Data Binding: মূল Bean থেকে নেস্টেড Bean এর প্রপার্টি সমূহকে ডেটা বাউন্ড বা পপুলেট করা।
  2. Validation: নেস্টেড Bean এর প্রপার্টি গুলোর ভ্যালিডেশন।

১. Nested Beans Handling Using Spring MVC (Data Binding)

Spring MVC এ নেস্টেড Beans হ্যান্ডলিং খুবই জনপ্রিয়। Spring এর @ModelAttribute এবং Form Binding ব্যবহার করে মূল Bean থেকে নেস্টেড Bean এর প্রপার্টি কপি করা যায়।

উদাহরণ: Nested Beans with Spring MVC

ধরা যাক, আপনার কাছে একটি Person Bean রয়েছে, যা একটি Address Bean কে নেস্টেড প্রপার্টি হিসেবে ধারণ করছে। এই ডেটা গুলি Web Form এ ইনপুট নেয়া হবে এবং সেটি PersonDTO তে বাউন্ড করা হবে।

Step 1: Model Class - Person with Address (Nested Bean)
import javax.validation.Valid;

public class Person {
    private String firstName;
    private String lastName;
    private int age;

    @Valid
    private Address address;  // Nested Bean (Address)

    // Getters and setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

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;
    }
}
Step 2: Spring Controller for Data Binding
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.ui.Model;

@Controller
public class PersonController {

    @RequestMapping("/personForm")
    public String showForm(@ModelAttribute("person") Person person, Model model) {
        model.addAttribute("person", new Person());  // Initializing an empty Person Bean
        return "personForm";  // Return the view for the form
    }

    @RequestMapping(value = "/submitPerson", method = RequestMethod.POST)
    public String submitForm(@ModelAttribute("person") Person person, Model model) {
        model.addAttribute("message", "Person data submitted successfully");
        return "personDetails";  // Return the success view
    }
}
Step 3: personForm.jsp (Form for Person and Address)
<form:form method="POST" action="/submitPerson">
    <form:input path="firstName" label="First Name" />
    <form:input path="lastName" label="Last Name" />
    <form:input path="age" label="Age" />
    
    <!-- Nested Address Bean Fields -->
    <form:form path="address">
        <form:input path="street" label="Street" />
        <form:input path="city" label="City" />
        <form:input path="zipCode" label="Zip Code" />
    </form:form>

    <button type="submit">Submit</button>
</form:form>

ব্যাখ্যা:

  • Person Bean এর মধ্যে একটি Address Bean নেস্টেড প্রপার্টি হিসেবে রয়েছে।
  • Spring MVC-এ @ModelAttribute ব্যবহার করে ফর্মের ডেটা Person Bean এর মধ্যে ডায়নামিকভাবে মুছ করা হয়।
  • Nesting Forms: form:form ট্যাগের মাধ্যমে Address Bean-এর ফিল্ডগুলির জন্য ফর্ম তৈরি করা হয়েছে। এর মাধ্যমে nested beans-এর ডেটা Person Bean-এ পপুলেট করা হয়।

২. Validation in Nested Beans

নেস্টেড Beans এর মধ্যে ভ্যালিডেশন পরিচালনার জন্য JSR 303/JSR 380 Bean Validation API এবং Hibernate Validator ব্যবহার করা যেতে পারে। Spring MVC এ, @Valid অ্যানোটেশন ব্যবহার করে আপনি নেস্টেড Bean-এর ভ্যালিডেশন চালাতে পারেন।

উদাহরণ: Nested Beans Validation

Step 1: Person Bean with Validation Annotations
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.validation.Valid;

public class Person {
    @NotNull(message = "First name cannot be null")
    @Size(min = 2, max = 30, message = "First name should be between 2 and 30 characters")
    private String firstName;

    @NotNull(message = "Last name cannot be null")
    @Size(min = 2, max = 30, message = "Last name should be between 2 and 30 characters")
    private String lastName;

    @NotNull(message = "Age cannot be null")
    private int age;

    @Valid  // Trigger validation for nested bean (Address)
    private Address address;

    // Getters and setters...
}
Step 2: Controller with Validation Logic
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.validation.Valid;

@Controller
public class PersonController {

    @RequestMapping(value = "/submitPerson", method = RequestMethod.POST)
    public String submitForm(@Valid @ModelAttribute("person") Person person, BindingResult result) {
        if (result.hasErrors()) {
            return "personForm";  // Return to form with error messages
        }
        return "personDetails";  // Process valid data
    }
}

ব্যাখ্যা:

  • @Valid অ্যানোটেশন Person Bean এবং এর নেস্টেড Address Bean উভয়কে ভ্যালিডেট করার জন্য ব্যবহার করা হয়েছে।
  • BindingResult ব্যবহার করে, যদি কোনো validation error ঘটে তবে তা ফর্মে ফিরে দেখানো হবে।

৩. Nested Beans with Collection (List or Set of Beans)

যখন আপনি একটি List বা Set এর মধ্যে একাধিক nested beans রাখতে চান, তখন আপনি Spring@Valid এবং @ModelAttribute এর মাধ্যমে এগুলো পরিচালনা করতে পারেন।

উদাহরণ: Nested List of Beans

public class Team {
    private String teamName;

    @Valid
    private List<Player> players;  // List of nested Player Beans

    // Getters and setters...
}

public class Player {
    private String playerName;

    @NotNull(message = "Player name cannot be null")
    private int age;

    // Getters and setters...
}

ব্যাখ্যা:

  • এখানে Team Bean এর মধ্যে List একটি নেস্টেড Collection Bean রয়েছে।
  • @Valid ব্যবহার করে, Team Bean এর মধ্যে থাকা Player Bean গুলোর জন্য validation প্রক্রিয়া চালানো হবে।

সারাংশ

Nested Beans Handling হল এমন একটি প্রক্রিয়া যেখানে একটি Bean অন্য Bean-এর মধ্যে nested প্রপার্টি হিসেবে থাকে। Spring MVC তে @ModelAttribute এবং @Valid অ্যানোটেশন ব্যবহার করে এই nested Bean গুলির data binding এবং validation করা সম্ভব।

  • Data Binding এর মাধ্যমে nested beans এর প্রপার্টি ক্লিয়ারলি মডেলে অ্যাক্সেস এবং পপুলেট করা হয়।
  • Validation এর মাধ্যমে, nested beans এর প্রপার্টিগুলোর জন্য কাস্টম এবং built-in ভ্যালিডেশন করা হয়।
  • Collections of Nested Beans যেমন List বা Set ব্যবহার করা যেতে পারে একাধিক nested Bean ধারণ করার জন্য

Content added || updated By

Nested Beans হল এমন Java Beans, যেখানে একটি Bean অন্য Bean ধারণ করে। এই ধরনের Beans-এ, প্রধান Bean (parent Bean) এর প্রপার্টি অন্য একটি Bean (child Bean) ধারণ করতে পারে। এটি ডেটার মডুলার কাঠামো তৈরি করতে সাহায্য করে, যেমন Person Bean-এ একটি Address Bean।

Nested Beans এর প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন করার জন্য Apache Commons BeanUtils বা PropertyUtils এর মতো লাইব্রেরি ব্যবহার করা হয়, যেগুলো Nested Properties সাপোর্ট করে।

1. Nested Bean এর প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন

উদাহরণ: Nested Bean ব্যবহার করে প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন

import org.apache.commons.beanutils.BeanUtils;

public class NestedBeanExample {
    public static void main(String[] args) {
        try {
            // Create Address object (Nested Bean)
            Address address = new Address("Street 123", "City A");

            // Create Person object with nested Address object
            Person person = new Person("John", 30, address);

            // Access nested properties using BeanUtils
            System.out.println("Before Manipulation:");
            System.out.println("Name: " + BeanUtils.getProperty(person, "name")); // Output: John
            System.out.println("Street: " + BeanUtils.getProperty(person, "address.street")); // Output: Street 123
            System.out.println("City: " + BeanUtils.getProperty(person, "address.city")); // Output: City A

            // Manipulate nested properties using BeanUtils
            BeanUtils.setProperty(person, "address.street", "Street 456");
            BeanUtils.setProperty(person, "address.city", "City B");

            // Output manipulated nested properties
            System.out.println("\nAfter Manipulation:");
            System.out.println("Street: " + BeanUtils.getProperty(person, "address.street")); // Output: Street 456
            System.out.println("City: " + BeanUtils.getProperty(person, "address.city")); // Output: City B
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    public Person() {}

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // Getter and setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    // Getter and setter methods
    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;
    }
}

ব্যাখ্যা:

  1. Nested Bean: এখানে Person Bean এর মধ্যে Address Bean রয়েছে। address.street এবং address.city একটি নেস্টেড প্রপার্টি।
  2. BeanUtils.getProperty(): BeanUtils এর getProperty() মেথড ব্যবহার করে, আমরা Person Bean এবং Address Bean এর প্রপার্টি অ্যাক্সেস করেছি।
  3. BeanUtils.setProperty(): BeanUtils এর setProperty() মেথড ব্যবহার করে nested address এর প্রপার্টি manipulate (বদলানো) করেছি।

আউটপুট:

Before Manipulation:
Name: John
Street: Street 123
City: City A

After Manipulation:
Street: Street 456
City: City B

এখানে, nested প্রপার্টি যেমন address.street এবং address.city অ্যাক্সেস এবং ম্যানিপুলেট করা হয়েছে।


2. PropertyUtils ব্যবহার করে Nested Bean এর প্রপার্টি অ্যাক্সেস এবং Manipulation

PropertyUtils ক্লাসটি Apache Commons BeanUtils লাইব্রেরির একটি অংশ, যা BeanUtils এর মতো প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন করতে ব্যবহৃত হয়, তবে এটি আরও বেশি ফিচার এবং সহজ পদ্ধতিতে nested properties এর সাথে কাজ করতে সক্ষম।

উদাহরণ: PropertyUtils ব্যবহার করে Nested Bean-এর প্রপার্টি অ্যাক্সেস এবং Manipulation

import org.apache.commons.beanutils.PropertyUtils;

public class PropertyUtilsNestedExample {
    public static void main(String[] args) {
        try {
            // Create Address object (Nested Bean)
            Address address = new Address("Street 123", "City A");

            // Create Person object with nested Address object
            Person person = new Person("John", 30, address);

            // Access nested properties using PropertyUtils
            System.out.println("Before Manipulation:");
            System.out.println("Name: " + PropertyUtils.getProperty(person, "name")); // Output: John
            System.out.println("Street: " + PropertyUtils.getProperty(person, "address.street")); // Output: Street 123
            System.out.println("City: " + PropertyUtils.getProperty(person, "address.city")); // Output: City A

            // Manipulate nested properties using PropertyUtils
            PropertyUtils.setProperty(person, "address.street", "Street 456");
            PropertyUtils.setProperty(person, "address.city", "City B");

            // Output manipulated nested properties
            System.out.println("\nAfter Manipulation:");
            System.out.println("Street: " + PropertyUtils.getProperty(person, "address.street")); // Output: Street 456
            System.out.println("City: " + PropertyUtils.getProperty(person, "address.city")); // Output: City B
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  1. PropertyUtils.getProperty(): PropertyUtils.getProperty() মেথড ব্যবহার করে nested address.street এবং address.city প্রপার্টি অ্যাক্সেস করা হয়েছে।
  2. PropertyUtils.setProperty(): PropertyUtils.setProperty() মেথড ব্যবহার করে nested প্রপার্টি ম্যানিপুলেট করা হয়েছে।

আউটপুট:

Before Manipulation:
Name: John
Street: Street 123
City: City A

After Manipulation:
Street: Street 456
City: City B

3. Nested Bean Access এবং Manipulation এর কিছু গুরুত্বপূর্ণ পদ্ধতি

  • BeanUtils.copyProperties(): এক Bean থেকে অন্য Bean-এ প্রপার্টি কপি করার জন্য।
  • PropertyUtils.getProperty(): Bean বা nested Bean-এর প্রপার্টি অ্যাক্সেস করতে।
  • PropertyUtils.setProperty(): Bean বা nested Bean-এর প্রপার্টি সেট করতে।

4. Nested Bean এর সাথে অন্যান্য ফ্রেমওয়ার্কের সমন্বয়

  • Spring Framework: Spring IoC (Inversion of Control) কন্টেইনারে nested beans কাজ করে খুবই সহজে। Spring Bean validation এবং dependency injection এর সাথে আপনি nested beans ব্যবহার করতে পারবেন।
  • Hibernate: Hibernate ORM এ nested properties কাস্টম entity Bean হিসাবে ব্যবহৃত হয়, যা ডাটাবেস টেবিলের সাথে মেপ করা হয়।

সারাংশ

  • Nested Beans হল Java Beans যেখানে একটি Bean অন্য Bean ধারণ করে। এটি Java Beans এর মধ্যে ডেটার গঠন এবং মডুলারিটি নিশ্চিত করে।
  • BeanUtils এবং PropertyUtils এর মাধ্যমে আপনি nested properties অ্যাক্সেস এবং ম্যানিপুলেট করতে পারেন।
  • BeanUtils.getProperty() এবং PropertyUtils.getProperty() এর মাধ্যমে nested Bean-এর প্রপার্টি অ্যাক্সেস করা যায় এবং setProperty() মেথডের মাধ্যমে nested properties পরিবর্তন বা ম্যানিপুলেট করা সম্ভব।
Content added || updated By

Apache Commons BeanUtils লাইব্রেরি ব্যবহার করে আপনি সহজেই একটি Bean-এর মধ্যে থাকা Nested Bean এর ডেটা কপি বা ট্রান্সফার করতে পারেন। BeanUtils নেস্টেড প্রপার্টি হ্যান্ডল করার জন্য খুবই কার্যকর। এটি আপনাকে একটি Object-এর Nested Properties কপি বা ম্যানিপুলেট করার সুবিধা দেয়।


কাজের ধাপ

  1. Nested Bean তৈরি করা: একটি Bean-এর প্রপার্টি হিসেবে আরেকটি Bean যুক্ত করা।
  2. BeanUtils.copyProperties() ব্যবহার: Parent Bean থেকে Target Bean-এ ডেটা ট্রান্সফার করা।
  3. Nested Properties Access এবং Manipulation: Nested প্রপার্টির ডেটা Access এবং পরিবর্তন করা।

উদাহরণ: Nested Bean এর Data Transfer

১. Bean তৈরি করা

public class Person {
    private String name;
    private int age;
    private Address address;

    public Person() {}

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // Getter and Setter Methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

class Address {
    private String street;
    private String city;

    public Address() {}

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    // Getter and Setter Methods
    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;
    }
}

২. Nested Bean এর Data Transfer করা

import org.apache.commons.beanutils.BeanUtils;

public class NestedBeanExample {
    public static void main(String[] args) {
        try {
            // Source Bean
            Address address = new Address("123 Main St", "City A");
            Person sourcePerson = new Person("John Doe", 25, address);

            // Target Bean
            Person targetPerson = new Person();

            // Copy properties from source to target
            BeanUtils.copyProperties(targetPerson, sourcePerson);

            // Output the copied properties
            System.out.println("Target Name: " + targetPerson.getName());
            System.out.println("Target Age: " + targetPerson.getAge());
            System.out.println("Target Street: " + targetPerson.getAddress().getStreet());
            System.out.println("Target City: " + targetPerson.getAddress().getCity());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Target Name: John Doe
Target Age: 25
Target Street: 123 Main St
Target City: City A

ব্যাখ্যা:

  1. Source Bean তৈরি করা: sourcePerson-এর মধ্যে Address একটি Nested Bean হিসেবে যুক্ত।
  2. BeanUtils.copyProperties(): এই মেথড Parent Bean (sourcePerson) থেকে Target Bean (targetPerson)-এ ডেটা কপি করে।
  3. Nested Properties কপি: sourcePerson Bean এর address প্রপার্টির street এবং city ভ্যালু targetPerson-এ কপি করা হয়েছে।

Nested Properties Access এবং Manipulation

BeanUtils ব্যবহার করে আপনি Nested Properties সরাসরি Access এবং Manipulate করতে পারেন। এর জন্য PropertyUtils ব্যবহার করা যায়।

Nested Properties Access করা

import org.apache.commons.beanutils.PropertyUtils;

public class NestedPropertyAccessExample {
    public static void main(String[] args) {
        try {
            // Create Source Bean
            Address address = new Address("456 Elm St", "City B");
            Person person = new Person("Jane Doe", 30, address);

            // Access Nested Properties
            String street = (String) PropertyUtils.getNestedProperty(person, "address.street");
            String city = (String) PropertyUtils.getNestedProperty(person, "address.city");

            // Modify Nested Properties
            PropertyUtils.setNestedProperty(person, "address.street", "789 Pine St");

            // Output the updated properties
            System.out.println("Street: " + street);                  // Output: 456 Elm St
            System.out.println("City: " + city);                      // Output: City B
            System.out.println("Updated Street: " + person.getAddress().getStreet()); // Output: 789 Pine St
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

আউটপুট:

Street: 456 Elm St
City: City B
Updated Street: 789 Pine St

PropertyUtils এবং BeanUtils এর পার্থক্য

বৈশিষ্ট্যBeanUtilsPropertyUtils
টাইপ কনভার্সনটাইপ কনভার্সন সাপোর্ট করে।টাইপ কনভার্সন সাপোর্ট করে না।
Nested Properties Accessসরাসরি Nested Properties অ্যাক্সেস করা যায় না।সরাসরি Nested Properties অ্যাক্সেস এবং পরিবর্তন করা যায়।
ব্যবহারপ্রপার্টি কপি করার জন্য বেশি কার্যকর।প্রপার্টি অ্যাক্সেস এবং ম্যানিপুলেশন।

সারাংশ

  • BeanUtils.copyProperties() Nested Bean থেকে Parent Bean-এ ডেটা কপি করার জন্য ব্যবহার করা হয়।
  • PropertyUtils Nested Properties সরাসরি Access এবং Manipulate করার জন্য বেশি কার্যকর।
  • Nested Bean এর ডেটা ট্রান্সফার এবং ম্যানিপুলেশনের জন্য BeanUtils এবং PropertyUtils উভয়ই গুরুত্বপূর্ণ টুল। আপনার কাজের ধরণ অনুযায়ী এগুলোর ব্যবহার নির্বাচন করুন।
Content added || updated By

Apache Commons BeanUtils লাইব্রেরির PropertyUtils.getNestedProperty() মেথডটি একটি nested property অ্যাক্সেস করার জন্য ব্যবহৃত হয়। এটি একটি নির্দিষ্ট প্রপার্টি বা ফিল্ডকে অ্যাক্সেস করতে সহায়তা করে, যা অন্য কোন অবজেক্টের মধ্যে থাকে। অর্থাৎ, একটি Java Bean এর মধ্যে অন্য একটি Bean (nested Bean) থাকতে পারে এবং এই মেথডটি সেটি অ্যাক্সেস করতে ব্যবহৃত হয়।

Syntax:

public static Object getNestedProperty(Object bean, String name) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException
  • bean: Bean অবজেক্ট, যেখানে প্রপার্টি খোঁজা হবে।
  • name: প্রপার্টি বা nested প্রপার্টির নাম, এটি পয়েন্টার হিসেবে কাজ করে, যেখানে nested properties পিরামিডের মতো লেখা হয়। (যেমন "address.street")

Return Value:

  • এটি প্রপার্টির মান রিটার্ন করে, যদি এটি পাওয়া যায়। যদি প্রপার্টি না থাকে, তাহলে NoSuchMethodException বা IllegalAccessException ছুঁড়ে দেওয়া হয়।

PropertyUtils.getNestedProperty() এর উদাহরণ

উদাহরণ ১: Nested Property অ্যাক্সেস করা

ধরা যাক, আমাদের কাছে দুটি Bean আছে: Person এবং AddressPerson Bean-এ একটি Address Bean রয়েছে, এবং আমরা PropertyUtils.getNestedProperty() মেথড ব্যবহার করে Address Bean এর প্রপার্টি (যেমন street) অ্যাক্সেস করতে পারব।

import org.apache.commons.beanutils.PropertyUtils;

public class NestedPropertyExample {
    public static void main(String[] args) {
        try {
            // Create Address object
            Address address = new Address("Street 123", "City A");

            // Create Person object with nested Address object
            Person person = new Person("John", 30, address);

            // Accessing nested properties using PropertyUtils.getNestedProperty()
            String street = (String) PropertyUtils.getNestedProperty(person, "address.street");
            System.out.println("Street: " + street);  // Output: Street 123
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Person {
    private String name;
    private int age;
    private Address address;

    public Person(String name, int age, Address address) {
        this.name = name;
        this.age = age;
        this.address = address;
    }

    // Getter and setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

class Address {
    private String street;
    private String city;

    public Address(String street, String city) {
        this.street = street;
        this.city = city;
    }

    // Getter and setter methods
    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;
    }
}

ব্যাখ্যা:

  1. PropertyUtils.getNestedProperty(person, "address.street") ব্যবহার করে, আমরা Person Bean এর মধ্যে থাকা nested Address Bean এর street প্রপার্টি অ্যাক্সেস করেছি।
  2. এটি Address Bean এর street প্রপার্টি রিটার্ন করবে, যেটি Street 123

উদাহরণ ২: Nested Property Access with Nested Levels

ধরা যাক, আরো গভীর nested প্রপার্টি অ্যাক্সেস করতে চাই। যেমন Person Bean এর মধ্যে Address Bean এবং তার ভিতরে City নামে আরো একটি nested প্রপার্টি রয়েছে।

import org.apache.commons.beanutils.PropertyUtils;

public class MultiLevelNestedPropertyExample {
    public static void main(String[] args) {
        try {
            // Create Address object
            Address address = new Address("Street 123", "City A");

            // Create Person object with nested Address object
            Person person = new Person("John", 30, address);

            // Accessing multiple levels of nested properties
            String city = (String) PropertyUtils.getNestedProperty(person, "address.city");
            System.out.println("City: " + city);  // Output: City A
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • এখানে PropertyUtils.getNestedProperty() ব্যবহার করে আমরা Person Bean এর মধ্যে থাকা Address Bean এর ভিতরে থাকা city প্রপার্টি অ্যাক্সেস করেছি।

PropertyUtils.getNestedProperty() এর সুবিধা

  1. Nested Property Access: এটি একটি Bean এর মধ্যে থাকা অন্য Bean এর প্রপার্টি অ্যাক্সেস করতে সক্ষম।
  2. Multiple Nested Levels: আপনি একাধিক স্তরের nested properties অ্যাক্সেস করতে পারেন, যেমন "address.city"
  3. Efficient and Clean Code: এটি আপনার কোডকে অনেক বেশি পরিষ্কার এবং কার্যকরী করে, বিশেষত যখন Bean গুলোর মধ্যে nested properties থাকে।

PropertyUtils.getNestedProperty() এবং BeanUtils Bean

  • BeanUtils সাধারণত Bean এর মধ্যে ডেটা কপি করার জন্য ব্যবহৃত হয়, যখন PropertyUtils একটি নির্দিষ্ট প্রপার্টি (অথবা nested property) অ্যাক্সেস করার জন্য ব্যবহৃত হয়।
  • PropertyUtils.getNestedProperty() আপনাকে nested properties অ্যাক্সেস করার জন্য একটি সহজ এবং কার্যকরী পদ্ধতি প্রদান করে, যা একাধিক Bean এর মধ্যে সম্পর্কিত ডেটা অ্যাক্সেস করতে সাহায্য করে।

সারাংশ

PropertyUtils.getNestedProperty() একটি অত্যন্ত কার্যকরী মেথড যা আপনাকে Java Bean এর মধ্যে থাকা nested properties অ্যাক্সেস করতে সাহায্য করে। এটি Bean এর মধ্যে অন্য Bean এর প্রপার্টি অ্যাক্সেস এবং বিভিন্ন স্তরের nested properties সমর্থন করে, যা ডেটা ম্যানিপুলেশন এবং কপি করার ক্ষেত্রে আরও সুবিধাজনক হয়।

Content added || updated By

BeanUtils লাইব্রেরি ব্যবহার করে আপনি Java Beans-এর মধ্যে ডেটা কপি করতে পারেন, এবং এটি complex nested structures (যেমন, একাধিক স্তরের nested objects) এর ক্ষেত্রে খুবই কার্যকরী হতে পারে। এখানে আমরা দেখব কিভাবে nested structures বা complex data models এর মধ্যে ডেটা কপি করা যায়।

Scenario:

ধরা যাক, আমাদের একটি Order Bean রয়েছে, যার মধ্যে অনেকগুলো nested objects রয়েছে, যেমন Customer, Address, এবং **Product**। আমাদের কাজ হবে একটি Order অবজেক্ট থেকে অন্য Order অবজেক্টে ডেটা কপি করা, যেখানে nested ডেটা এবং complex objects একে অপরকে অন্তর্ভুক্ত করছে।


উদাহরণ: Complex Nested Structure-এ BeanUtils এর ব্যবহার

Step 1: Complex Beans তৈরি করা

আমরা কয়েকটি ক্লাস তৈরি করব:

  1. Order: যেখানে Customer এবং Address অবজেক্ট থাকবে।
  2. Customer: যার মধ্যে নাম, ইমেইল এবং ফোন নম্বর থাকবে।
  3. Address: যেখানে স্ট্রিট, সিটি, এবং পোস্টাল কোড থাকবে।
  4. Product: যার মধ্যে নাম, দাম এবং পরিমাণ থাকবে।

Step 2: Bean Definition

import java.util.List;

public class Order {
    private Customer customer;
    private Address shippingAddress;
    private List<Product> products;

    // Getter and Setter methods
    public Customer getCustomer() {
        return customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    public Address getShippingAddress() {
        return shippingAddress;
    }

    public void setShippingAddress(Address shippingAddress) {
        this.shippingAddress = shippingAddress;
    }

    public List<Product> getProducts() {
        return products;
    }

    public void setProducts(List<Product> products) {
        this.products = products;
    }
}

class Customer {
    private String name;
    private String email;
    private String phone;

    // Getter and Setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

class Address {
    private String street;
    private String city;
    private String postalCode;

    // Getter and Setter methods
    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;
    }
}

class Product {
    private String name;
    private double price;
    private int quantity;

    // Getter and Setter methods
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getQuantity() {
        return quantity;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }
}

Step 3: BeanUtils দিয়ে Nested Objects Copy করা

এখন, আমরা BeanUtils.copyProperties() মেথড ব্যবহার করব যাতে Order অবজেক্টের মধ্যে থাকা Customer, Address এবং Product এর প্রপার্টি কপি করা যায়।

import org.apache.commons.beanutils.BeanUtils;
import java.util.Arrays;

public class ComplexBeanCopyExample {
    public static void main(String[] args) {
        try {
            // Create source Order object with nested properties
            Order sourceOrder = new Order();

            Customer sourceCustomer = new Customer();
            sourceCustomer.setName("John Doe");
            sourceCustomer.setEmail("john.doe@example.com");
            sourceCustomer.setPhone("123-456-7890");

            Address sourceAddress = new Address();
            sourceAddress.setStreet("123 Elm Street");
            sourceAddress.setCity("Springfield");
            sourceAddress.setPostalCode("62701");

            Product sourceProduct1 = new Product();
            sourceProduct1.setName("Laptop");
            sourceProduct1.setPrice(1200.00);
            sourceProduct1.setQuantity(1);

            Product sourceProduct2 = new Product();
            sourceProduct2.setName("Phone");
            sourceProduct2.setPrice(800.00);
            sourceProduct2.setQuantity(2);

            sourceOrder.setCustomer(sourceCustomer);
            sourceOrder.setShippingAddress(sourceAddress);
            sourceOrder.setProducts(Arrays.asList(sourceProduct1, sourceProduct2));

            // Create target Order object
            Order targetOrder = new Order();

            // Use BeanUtils to copy properties from source to target
            BeanUtils.copyProperties(targetOrder, sourceOrder);

            // Print the copied properties to check
            System.out.println("Target Order Customer Name: " + targetOrder.getCustomer().getName());
            System.out.println("Target Order Shipping Address: " + targetOrder.getShippingAddress().getStreet());
            System.out.println("Target Order Product 1 Name: " + targetOrder.getProducts().get(0).getName());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • Order, Customer, Address, এবং Product Beans তৈরি করা হয়েছে।
  • sourceOrder থেকে targetOrder এ প্রপার্টি কপি করার জন্য BeanUtils.copyProperties() ব্যবহার করা হয়েছে।
  • BeanUtils.copyProperties() মেথড শুধুমাত্র flat properties (যেমন String, int) কপি করতে পারে, কিন্তু nested properties (যেমন Customer এবং Address অবজেক্ট) কপি করতে এটি সরাসরি কাজ করবে না।
  • Nested properties কপি করতে, যদি nested object গুলোর প্রপার্টি কপি করতে চান, তখন আপনাকে recursive copy বা custom copy logic প্রয়োগ করতে হবে। BeanUtils সাধারণত এই ধরনের nested objects কে একসাথে কপি করে না।

৪. Deep Copy (Nested Objects Copying)

যখন আপনার nested objects (যেমন Customer, Address) সহ complex structures কপি করতে হয়, তখন deep copy করার প্রয়োজন হয়, যেখানে source object এর ভ্যালু target object এর মধ্যে পুরোপুরি কপি হয়ে যায়, যাতে original object এর কোনো পরিবর্তন target object-এ প্রভাব ফেলতে না পারে।

উদাহরণ: Deep Copy with BeanUtils

import org.apache.commons.beanutils.BeanUtils;

public class DeepCopyExample {
    public static void main(String[] args) {
        try {
            // Create source Order object
            Order sourceOrder = new Order();
            Customer sourceCustomer = new Customer();
            sourceCustomer.setName("Jane Doe");
            sourceCustomer.setEmail("jane.doe@example.com");
            sourceCustomer.setPhone("987-654-3210");

            Address sourceAddress = new Address();
            sourceAddress.setStreet("456 Oak Avenue");
            sourceAddress.setCity("Chicago");
            sourceAddress.setPostalCode("60601");

            Product sourceProduct = new Product();
            sourceProduct.setName("Tablet");
            sourceProduct.setPrice(300.00);
            sourceProduct.setQuantity(3);

            sourceOrder.setCustomer(sourceCustomer);
            sourceOrder.setShippingAddress(sourceAddress);
            sourceOrder.setProducts(Arrays.asList(sourceProduct));

            // Perform a deep copy (manual approach for nested objects)
            Order targetOrder = new Order();
            BeanUtils.copyProperties(targetOrder, sourceOrder);

            // Deep copy for nested objects manually
            targetOrder.setCustomer(new Customer());
            BeanUtils.copyProperties(targetOrder.getCustomer(), sourceOrder.getCustomer());

            targetOrder.setShippingAddress(new Address());
            BeanUtils.copyProperties(targetOrder.getShippingAddress(), sourceOrder.getShippingAddress());

            // Output the copied data
            System.out.println("Target Order Customer Name: " + targetOrder.getCustomer().getName());
            System.out.println("Target Order Shipping Address: " + targetOrder.getShippingAddress().getStreet());
            System.out.println("Target Order Product Name: " + targetOrder.getProducts().get(0).getName());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

ব্যাখ্যা:

  • এই উদাহরণে deep copy করতে, BeanUtils.copyProperties() এর মাধ্যমে Order অবজেক্টের প্রপার্টি কপি করা হয়েছে।
  • Nested objects (যেমন Customer এবং Address) জন্য কাস্টমভাবে deep copy করা হয়েছে, যেখানে প্রতিটি nested object-এর জন্য new instance তৈরি করে copyProperties() ব্যবহার করা হয়েছে।

সারাংশ

  • Complex Nested Structure-এ BeanUtils ব্যবহার করতে হলে সাধারণত flat properties সরাসরি কপি করা যায়, কিন্তু nested properties এর জন্য manual deep copy

প্রয়োজন হতে পারে।

  • copyProperties() মেথড এক বা একাধিক nested objects এর মধ্যে ডেটা কপি করার জন্য BeanUtils ব্যবহার করা যায়, তবে deep copy এর জন্য কাস্টম কপি লজিক প্রয়োগ করতে হয়।
  • Nested objects কপি করার ক্ষেত্রে deep copy এর মাধ্যমে, আপনি source object এর মূল ডেটাকে target object-এ পুরোপুরি স্থানান্তর করতে পারেন, যাতে পরবর্তীতে একটিতে পরিবর্তন হলে অন্যটিতে প্রভাব না পড়ে।
Content added || updated By
Promotion

Are you sure to start over?

Loading...