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

@JsonIdentityInfo এবং Object Identity - জ্যাকসন অ্যানোটেশন (Jackson Annotations) - Java Technologies

275

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
Promotion

Are you sure to start over?

Loading...