@JsonIdentityInfo এবং Object Identity গাইড ও নোট

Java Technologies - জ্যাকসন অ্যানোটেশন (Jackson Annotations)
343

Jackson-এর @JsonIdentityInfo অ্যানোটেশন ব্যবহার করে আপনি Object Identity পরিচালনা করতে পারেন। এটি বিশেষভাবে Circular Reference সমস্যার সমাধানে ব্যবহৃত হয় এবং Object Identity ট্র্যাক করতে সাহায্য করে, যাতে JSON Serialization এবং Deserialization সময়ে অবজেক্টের পুনরাবৃত্তি (duplicate) এড়ানো যায়।

@JsonIdentityInfo কীভাবে কাজ করে?

@JsonIdentityInfo অ্যানোটেশনটি একটি unique identifier দিয়ে অবজেক্টকে চিহ্নিত করে। যখন একই অবজেক্টটি JSON এ পুনরায় দেখা যায়, তখন এটি ঐ unique identifier ব্যবহার করে পুনরায় রেফারেন্স করে, যাতে Circular References থেকে সমস্যা এড়ানো যায়।

  • এটি অবজেক্টের identity ট্র্যাক করার জন্য Object ID ব্যবহার করে।
  • Object Id সাধারণত অবজেক্টের @Id ফিল্ড বা কোনো প্রপার্টি হতে পারে।

@JsonIdentityInfo ব্যবহার করার জন্য ধাপ:

  1. @JsonIdentityInfo অ্যানোটেশন যোগ করা।
  2. ObjectIdGenerators নির্বাচন করা।
  3. Circular references এড়ানোর জন্য ** @JsonIdentityInfo ব্যবহার করা।**

@JsonIdentityInfo এর প্যারামিটারসমূহ

প্যারামিটারবর্ণনা
generatorঅবজেক্টের জন্য ইউনিক আইডেন্টিটি নির্ধারণে কোন ObjectIdGenerator ব্যবহার করা হবে।
propertyইউনিক আইডেন্টিটির জন্য কোন প্রপার্টি বা ফিল্ড ব্যবহার হবে।

Practical Example of @JsonIdentityInfo

প্রথম উদাহরণ: Basic Object Identity

ধরা যাক, Person এবং Address নামক দুটি ক্লাস রয়েছে, যেখানে Person ক্লাসের একটি Address রেফারেন্স রয়েছে, এবং Address ক্লাসের একটি Person রেফারেন্স রয়েছে।

Person ক্লাস (Parent):
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Person {
    private int id;
    private String name;
    private Address address;

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

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int 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 ক্লাস (Child):
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Address {
    private int id;
    private String street;
    private String city;
    private Person person;

    // Constructor
    public Address(int id, String street, String city, Person person) {
        this.id = id;
        this.street = street;
        this.city = city;
        this.person = person;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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 Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonIdentityInfoExample {
    public static void main(String[] args) throws Exception {
        // Create objects
        Person person = new Person(1, "John", null);
        Address address = new Address(2, "123 Elm St", "Springfield", person);
        person.setAddress(address);

        // Serialize objects to JSON
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(person);

        System.out.println(json);
    }
}
JSON Output:
{
  "id": 1,
  "name": "John",
  "address": {
    "id": 2,
    "street": "123 Elm St",
    "city": "Springfield",
    "person": 1
  }
}

ব্যাখ্যা:

  • Person এবং Address ক্লাসে @JsonIdentityInfo অ্যানোটেশন ব্যবহার করা হয়েছে।
  • property = "id" দ্বারা অবজেক্টের ID প্রপার্টি নির্ধারণ করা হয়েছে, যা unique identifier হিসেবে কাজ করবে।
  • JSON আউটপুটে, person ফিল্ডে Address ক্লাসের জন্য 1 রেফারেন্স আইডি ব্যবহার করা হয়েছে, যা Person অবজেক্টের ID হিসেবে রয়েছে।

এটি Circular Reference সমস্যা এড়াতে সহায়তা করে, কারণ এখানে person অবজেক্টের পুনরাবৃত্তি রাখা হয়নি, বরং এর unique ID রেফার করা হয়েছে।


@JsonIdentityInfo এবং Circular Reference

যখন আপনি একটি বায়োডাইরেকশনাল সম্পর্ক বা Circular Reference (যেমন Parent-Child সম্পর্ক) ব্যবহার করছেন এবং অবজেক্টগুলোর মধ্যে একে অপরকে রেফারেন্স করছেন, তখন @JsonIdentityInfo অ্যানোটেশন ব্যবহার করা খুবই উপকারী।

Circular Reference Example:

public class Person {
    private int id;
    private String name;

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
    private Address address;

    // Constructor, Getters and Setters
}

public class Address {
    private int id;
    private String street;

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
    private Person person;

    // Constructor, Getters and Setters
}

এখন, Person এবং Address অবজেক্টগুলি একে অপরকে রেফারেন্স করছে এবং @JsonIdentityInfo এই সম্পর্ককে সঠিকভাবে unique ID দিয়ে ট্র্যাক করে, যা Circular Reference সমস্যাটি সমাধান করে।


@JsonIdentityInfo এর সুবিধা:

  1. Circular References এড়ানো:
    • একে অপরকে রেফারেন্স করা অবজেক্টগুলোর জন্য circular references সহজেই সমাধান করা যায়।
  2. Performance Optimization:
    • JSON আউটপুটে পুনরাবৃত্তি এড়াতে, তাই মেমোরি ব্যবহারে সাশ্রয় হয় এবং পারফরম্যান্স উন্নত হয়।
  3. Bidirectional Relationships:
    • Bi-directional relationships হ্যান্ডল করতে @JsonIdentityInfo খুব কার্যকর।
  • @JsonIdentityInfo অ্যানোটেশনটি Circular Reference সমস্যার সমাধান এবং Object Identity ট্র্যাক করার জন্য ব্যবহার করা হয়।
  • এটি unique object identifiers ব্যবহার করে, যাতে parent-child relationships বা bi-directional references নির্ভুলভাবে সঠিকভাবে serialize/deserialized হয়।
  • @JsonIdentityInfo ব্যবহার করলে মেমোরি ব্যবহারে সাশ্রয় হয় এবং পারফরম্যান্সের উন্নতি ঘটে, কারণ এটি পুনরাবৃত্তি অবজেক্টের পরিবর্তে তার ID রেফারেন্স করে।
Content added By

@JsonIdentityInfo এর মাধ্যমে object references ব্যবহার

265

Jackson-এর @JsonIdentityInfo অ্যানোটেশনটি Circular References এবং Object References পরিচালনা করার জন্য ব্যবহৃত হয়। এটি বিশেষভাবে উপকারী যখন আপনার অবজেক্টের মধ্যে bi-directional references (একটি অবজেক্ট অন্য অবজেক্টকে রেফার করে এবং পরবর্তীতে সেই অবজেক্ট আবার প্রথমটি রেফার করে) থাকে এবং আপনি ঐ অবজেক্টগুলোর রেফারেন্সগুলো flat structure-এ JSON-এ প্রদর্শন করতে চান।

@JsonIdentityInfo এর মূল বৈশিষ্ট্য:

  1. Circular Reference Management:
    • এটি circular references (যেমন: Parent -> Child -> Parent) সমাধান করতে সহায়তা করে।
    • আপনার অবজেক্টের রেফারেন্সকে ID দিয়ে চিহ্নিত করে যাতে সেগুলো JSON-এ সঠিকভাবে ম্যানেজ করা যায়।
  2. Object References:
    • একাধিক অবজেক্টের মধ্যে রেফারেন্স শেয়ার করার জন্য ID ব্যবহার করতে সহায়তা করে।
    • একটি object থেকে অন্য object-এ রেফারেন্স করতে, JSON-এ একটি ইউনিক ID ব্যবহার করা হয়।
  3. Serialization:
    • Object-এর প্রতিটি রেফারেন্স ID হিসেবে JSON-এ সিরিয়ালাইজ করা হয়, যাতে circular reference এড়ানো যায় এবং ডুপ্লিকেট ডেটা তৈরি না হয়।

@JsonIdentityInfo এর বৈশিষ্ট্য:

  • generator: Object ID তৈরি করার জন্য কোন ObjectIdGenerator ব্যবহার করা হবে তা নির্ধারণ করে। এটি সাধারণত PropertyGenerator বা ObjectIdGenerators.UUIDGenerator হতে পারে।
  • property: ID ফিল্ডের নাম নির্ধারণ করে।

@JsonIdentityInfo এর উদাহরণ:

Scenario: Circular Reference এর সমস্যা সমাধান

ধরা যাক, আমাদের একটি Person এবং Address ক্লাস রয়েছে, যেখানে Person ক্লাসের একটি Address ফিল্ড এবং Address ক্লাসের একটি Person ফিল্ড রয়েছে। যদি আমরা এগুলোর মধ্যে bi-directional reference তৈরি করি, তাহলে circular reference সমস্যার সম্মুখীন হব।

Person ক্লাস (Parent):

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

public class Person {
    private int id;
    private String name;

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
    private Address address;

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

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int 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 ক্লাস (Child):

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

public class Address {
    private int id;
    private String street;
    private Person person;

    @JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
    private String city;

    public Address(int id, String street, String city, Person person) {
        this.id = id;
        this.street = street;
        this.city = city;
        this.person = person;
    }

    // Getters and Setters
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    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 Person getPerson() {
        return person;
    }

    public void setPerson(Person person) {
        this.person = person;
    }
}

Serialization Example:

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonIdentityInfoExample {
    public static void main(String[] args) throws Exception {
        // Create objects
        Person person = new Person(1, "John Doe", null);
        Address address = new Address(1, "1234 Elm St", "Springfield", person);

        // Set the Address object into the Person object
        person.setAddress(address);

        // Create ObjectMapper
        ObjectMapper mapper = new ObjectMapper();

        // Convert object to JSON
        String json = mapper.writeValueAsString(person);
        System.out.println("Serialized JSON: " + json);
    }
}

JSON Output:

{
  "id": 1,
  "name": "John Doe",
  "address": {
    "id": 1,
    "street": "1234 Elm St",
    "city": "Springfield",
    "person": 1
  }
}

ব্যাখ্যা:

  • @JsonIdentityInfo ব্যবহার করা হয়েছে Person এবং Address ক্লাসে।
  • address ফিল্ডের Person অবজেক্টের মধ্যে address ক্লাসের person রেফারেন্স আছে, কিন্তু JSON আউটপুটে circular reference এড়ানো হয়েছে।
  • @JsonIdentityInfo Object ID ব্যবহার করে circular references ম্যানেজ করেছে।
  • person এর ID হিসেবে 1 ব্যবহার করা হয়েছে, এবং address ফিল্ডের মধ্যে person এর রেফারেন্সকে 1 হিসেবে দেখানো হয়েছে।

@JsonIdentityInfo এর সুবিধা

  1. Circular Reference Handling:
    • Circular references (যেমন: parent -> child -> parent) সহজেই ID ব্যবহার করে পরিচালনা করা যায়।
  2. Object References Management:
    • Object references JSON-এ ID হিসেবে উল্লেখ করা হয়, যাতে ডুপ্লিকেট ডেটা এড়ানো যায়।
  3. Efficient Serialization:
    • একাধিক nested অবজেক্ট বা complex data structures প্রসেস করার সময় JSON আউটপুট ছোট এবং পরিষ্কার থাকে।
  4. Avoids Redundant Data:
    • JSON-এ একাধিক বার একই অবজেক্ট সিরিয়ালাইজ না হয়ে, শুধু ID দিয়ে সেই অবজেক্টের রেফারেন্স করা হয়।

  • @JsonIdentityInfo একটি গুরুত্বপূর্ণ অ্যানোটেশন যা Circular Reference এবং Object References সমাধানে ব্যবহৃত হয়।
  • এটি ID ব্যবহার করে nested বা bi-directional references সঠিকভাবে serializedeserialize করতে সহায়তা করে।
  • এটি JSON ডেটার কার্যকারিতা এবং পরিষ্কারতা বজায় রাখে, বিশেষত complex data structures-এ।
Content added By

Object Identity এবং Circular References এর সমস্যা সমাধান

255

Jackson লাইব্রেরি ব্যবহার করার সময় Circular References বা Bidirectional Relationships হ্যান্ডেল করা একটি সাধারণ সমস্যা। Circular Reference এর ফলে Jackson JSON ডেটা প্রসেসিংয়ের সময় infinite recursion বা StackOverflowError তৈরি হতে পারে।

Jackson-এ এই সমস্যা সমাধান করার জন্য Object Identity এর ধারণা ব্যবহার করা হয়, যা circular references এবং bidirectional relationships হ্যান্ডেল করতে সহায়তা করে।

Jackson আপনাকে @JsonIdentityInfo অ্যানোটেশন ব্যবহার করার মাধ্যমে এই সমস্যা সমাধান করার সুযোগ দেয়।


1. Circular References এবং Object Identity

Circular References তখন ঘটে যখন দুটি অবজেক্ট একে অপরকে রেফার করে। উদাহরণস্বরূপ, যদি User অবজেক্ট একটি Order অবজেক্টকে রেফার করে, এবং সেই Order অবজেক্ট আবার User অবজেক্টকে রেফার করে, তাহলে এটি circular reference তৈরি করে।

Jackson এই সম্পর্কের কারণে ইনফিনিট লুপে চলে যেতে পারে এবং এতে StackOverflowError হতে পারে।

Object Identity এর মাধ্যমে Jackson এই সম্পর্কগুলো হ্যান্ডেল করে। @JsonIdentityInfo অ্যানোটেশন দিয়ে আপনি Object Identity ভিত্তিক circular references সঠিকভাবে handle করতে পারেন, যেখানে Jackson Object ID ব্যবহার করে সেই object-এর পুনরাবৃত্তি রেফারেন্স চিহ্নিত করবে।


@JsonIdentityInfo অ্যানোটেশন

@JsonIdentityInfo অ্যানোটেশন Jackson কে নির্দেশ করে যে এটি Object Identity ব্যবহার করবে, যার মাধ্যমে একই অবজেক্টকে বারবার রেফারেন্স করার পরিবর্তে একে শুধুমাত্র একবারই JSON আউটপুটে প্রদর্শন করা হবে।

এই অ্যানোটেশনটি @JsonIdentityInfo ক্লাস বা ফিল্ডে প্রয়োগ করা যায় এবং generator এবং property প্যারামিটার ব্যবহার করে Object ID নির্ধারণ করতে হয়।

  • generator: এখানে ObjectIdGenerators.PropertyGenerator সাধারণত ব্যবহৃত হয়।
  • property: এটি সুনির্দিষ্ট ফিল্ড (যেমন id) নির্দেশ করে যা Object ID হিসেবে কাজ করবে।

Example: Circular References সমাধান @JsonIdentityInfo দিয়ে

Step 1: Bidirectional Relationship (Circular Reference)

public class User {
    private int id;
    private String name;
    private List<Order> orders;  // User has many Orders

    // Constructors, Getters, and Setters
}

public class Order {
    private int id;
    private String product;
    private User user;  // Order is associated with a User

    // Constructors, Getters, and Setters
}

এখানে, User এবং Order একে অপরকে রেফার করে, এবং এটি Circular Reference তৈরি করতে পারে।

Step 2: @JsonIdentityInfo প্রয়োগ

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class User {
    private int id;
    private String name;
    private List<Order> orders;

    // Constructors, Getters, and Setters
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Order {
    private int id;
    private String product;
    private User user;

    // Constructors, Getters, and Setters
}

Step 3: Serialization Example

import com.fasterxml.jackson.databind.ObjectMapper;

public class JsonIdentityInfoExample {
    public static void main(String[] args) throws Exception {
        // Create User and Orders
        User user = new User();
        user.setId(1);
        user.setName("Rahim");

        Order order1 = new Order();
        order1.setId(101);
        order1.setProduct("Laptop");
        order1.setUser(user);

        Order order2 = new Order();
        order2.setId(102);
        order2.setProduct("Phone");
        order2.setUser(user);

        user.setOrders(Arrays.asList(order1, order2));

        // Serialize to JSON
        ObjectMapper mapper = new ObjectMapper();
        String json = mapper.writeValueAsString(user);

        System.out.println(json);
    }
}

Output:

{
  "id": 1,
  "name": "Rahim",
  "orders": [
    {
      "id": 101,
      "product": "Laptop",
      "user": 1
    },
    {
      "id": 102,
      "product": "Phone",
      "user": 1
    }
  ]
}

এখানে, @JsonIdentityInfo ব্যবহার করে Jackson User এবং Order অবজেক্টের একই id ব্যবহার করে circular reference-এর সমস্যা সমাধান করেছে। "user": 1 এর মাধ্যমে Order অবজেক্টের User রেফারেন্স id হিসেবে চিহ্নিত করা হয়েছে।


@JsonIdentityInfo এর সুবিধা:

  1. Circular References:
    • Circular references বা Bidirectional relationships-এর ক্ষেত্রে এটি কাজ করে, যেখানে একই অবজেক্টকে একাধিকবার রেফার করা হয়।
  2. Memory Efficient:
    • একই অবজেক্টকে বারবার পুনরায় JSON আউটপুটে আসা থেকে রোধ করে, যা মেমরি দক্ষতা বাড়ায়।
  3. Cleaner JSON Output:
    • এটি অবজেক্টের ID ব্যবহার করে রিপিটিশন কমায়, ফলে JSON আউটপুট অনেক cleaner হয়।

@JsonManagedReference এবং @JsonBackReference এর সাথে @JsonIdentityInfo

যখন bidirectional relationships বা circular references থাকে, আপনি @JsonManagedReference এবং @JsonBackReference অ্যানোটেশনও ব্যবহার করতে পারেন।

@JsonManagedReference এবং @JsonBackReference উদাহরণ:

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonManagedReference;

public class User {
    private int id;
    private String name;

    @JsonManagedReference
    private List<Order> orders;

    // Constructors, Getters, and Setters
}

public class Order {
    private int id;
    private String product;

    @JsonBackReference
    private User user;

    // Constructors, Getters, and Setters
}

@JsonManagedReference parent object এর ফিল্ডে এবং @JsonBackReference child object এর ফিল্ডে ব্যবহার করা হয়, যাতে circular reference থেকে মুক্তি পাওয়া যায় এবং JSON Serialization এ একে অপরকে রেফারেন্স না করা হয়।


  • Circular References এবং Bidirectional Relationships Jackson JSON serialization এবং deserialization-এ একটি সাধারণ সমস্যা, যা @JsonIdentityInfo এবং @JsonManagedReference / @JsonBackReference অ্যানোটেশন ব্যবহার করে সমাধান করা যায়।
  • @JsonIdentityInfo ব্যবহার করে object identity ভিত্তিক Circular Reference সমস্যা সহজে সমাধান করা সম্ভব।
  • @JsonManagedReference এবং @JsonBackReference circular reference সমাধান করতে সহায়ক, যেখানে একটি অবজেক্টের child এবং parent সম্পর্কিত serialization এর সময় সাবধানে ব্যাবহার করা হয়।

এটি Jackson এর মাধ্যমে Bidirectional relationships এবং Circular References হ্যান্ডেল করতে খুবই কার্যকর এবং সহজ পদ্ধতি।

Content added By

Practical উদাহরণ সহ Object Identity এর ব্যবহার

302

Jackson-এর @JsonIdentityInfo অ্যানোটেশন একটি গুরুত্বপূর্ণ টুল, যা Object Identity হ্যান্ডেল করার জন্য ব্যবহৃত হয়। এটি বিশেষত Circular References বা Self-referencing অবজেক্টের ক্ষেত্রে গুরুত্বপূর্ণ। Object Identity এর মাধ্যমে, আপনি Jackson-কে বলতে পারেন যে একই অবজেক্টকে একাধিক স্থানে ব্যবহার করার সময়ে, এটি একটি unique identifier ব্যবহার করে সংরক্ষণ করবে, যা infinite recursion এড়াতে সাহায্য করে।


@JsonIdentityInfo কী?

Jackson এর @JsonIdentityInfo অ্যানোটেশন আপনাকে JSON এর মধ্যে object গুলোর identity সঠিকভাবে ট্র্যাক করতে সাহায্য করে। এর মাধ্যমে, object references কে unique id দিয়ে চিহ্নিত করা হয়, যাতে একই অবজেক্ট বারবার JSON এ serialize না হয়।

  • @JsonIdentityInfo একটি ObjectIdGenerators ব্যবহার করে object গুলোর জন্য একটি ইউনিক আইডেন্টিফায়ার তৈরি করে।
  • এটি circular references বা bidirectional references সঠিকভাবে serialize করতে ব্যবহৃত হয়, যেখানে একটি অবজেক্ট অন্য একটি অবজেক্টকে রেফার করে এবং সেই অবজেক্ট আবার প্রথম অবজেক্টটিকে রেফার করে।

@JsonIdentityInfo ব্যবহার করার জন্য উদাহরণ

ধরা যাক আমাদের একটি Parent এবং Child ক্লাস রয়েছে, যেখানে bidirectional references রয়েছে।

1. Parent এবং Child ক্লাস তৈরি করুন:

import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Parent {
    private int id;
    private String name;

    private Child child;

    // Constructors, Getters, and Setters
    public Parent(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Child getChild() {
        return child;
    }

    public void setChild(Child child) {
        this.child = child;
    }
}

@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
public class Child {
    private int id;
    private String name;

    private Parent parent;

    // Constructors, Getters, and Setters
    public Child(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public Parent getParent() {
        return parent;
    }

    public void setParent(Parent parent) {
        this.parent = parent;
    }
}

2. Serialization Example:

এখন, আমরা Parent এবং Child অবজেক্ট তৈরি করব এবং Jackson ব্যবহার করে এগুলোকে JSON-এ serialize করব।

import com.fasterxml.jackson.databind.ObjectMapper;

public class ObjectIdentityExample {
    public static void main(String[] args) throws Exception {
        Parent parent = new Parent(1, "Rahim");
        Child child = new Child(2, "Rita");

        parent.setChild(child);
        child.setParent(parent);

        // ObjectMapper initialization
        ObjectMapper objectMapper = new ObjectMapper();

        // Serialization
        String json = objectMapper.writeValueAsString(parent);

        System.out.println(json);
    }
}

3. JSON Output:

{
  "id": 1,
  "name": "Rahim",
  "child": {
    "id": 2,
    "name": "Rita",
    "parent": 1
  }
}

ব্যাখ্যা:

  • এখানে @JsonIdentityInfo ব্যবহার করা হয়েছে Parent এবং Child ক্লাসের জন্য। এতে parent অবজেক্টের মধ্যে child অবজেক্টের রেফারেন্স রয়েছে, এবং child অবজেক্টেও আবার parent অবজেক্টের রেফারেন্স রয়েছে।
  • Jackson @JsonIdentityInfo এর মাধ্যমে id ফিল্ডটি ব্যবহার করে parent এবং child অবজেক্টগুলোর রেফারেন্স সঠিকভাবে ট্র্যাক করেছে এবং infinite recursion এড়ানো হয়েছে।

@JsonIdentityInfo এর বিভিন্ন Configuration

1. Object Identity-এ Custom ID Generator ব্যবহার:

Jackson ডিফল্টভাবে PropertyGenerator ব্যবহার করে object identity তৈরি করে, তবে আপনি কাস্টম ID Generator ব্যবহার করতে পারেন।

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, property = "id")

এটি int sequence অনুসারে object identity তৈরি করবে।

2. @JsonIdentityInfo এর সঙ্গে @JsonBackReference ব্যবহার:

Bidirectional Relationship এর জন্য, আপনি @JsonBackReference এবং @JsonManagedReference একসঙ্গে ব্যবহার করতে পারেন।

@JsonBackReference
private Parent parent;

@JsonManagedReference
private Child child;

এই অ্যানোটেশনগুলির সাহায্যে, আপনি সহজেই Circular Reference সমাধান করতে পারেন।


@JsonIdentityInfo এর সুবিধা

  1. Circular References সমাধান:
    • যখন Parent এবং Child অবজেক্ট একে অপরকে রেফার করে, তখন এটি infinite recursion থেকে রক্ষা করে।
  2. Efficient Object Mapping:
    • একই অবজেক্ট একাধিকবার JSON এ উপস্থিত হলে, তা unique identifier হিসেবে ব্যবহার করা হয়, যাতে একাধিক রেফারেন্সে একই অবজেক্টের তথ্য বারবার না আসে।
  3. Serialization এবং Deserialization এর জন্য Data Integrity:
    • object identity ব্যবহার করে একই অবজেক্টের জন্য একাধিক reference manage করা যায় এবং সঠিকভাবে সেগুলোকে map করা যায়।

  1. @JsonIdentityInfo অ্যানোটেশন Jackson-এ Object Identity হ্যান্ডল করতে ব্যবহৃত হয় এবং Circular Reference সমস্যা সমাধান করে।
  2. Bidirectional References (যেমন Parent-Child relationships) সঠিকভাবে handle করার জন্য এটি অত্যন্ত কার্যকর।
  3. Custom Object Identity তৈরি করার জন্য কাস্টম ID Generators ব্যবহার করা যেতে পারে।
  4. Jackson অ্যানোটেশনগুলি complex object mapping এর ক্ষেত্রে কার্যকর এবং infinite recursion বা Circular Reference এড়াতে সাহায্য করে।
Content added By
Promotion

Are you sure to start over?

Loading...