Circular Reference কি এবং এর সমস্যা

Circular References এবং Bidirectional Relationships হ্যান্ডল করা - জ্যাকসন (Jackson) - Java Technologies

318

Circular Reference বলতে বোঝায়, যখন দুটি বা তার চেয়ে বেশি অবজেক্ট একে অপরকে রেফার করে এবং এর ফলে একটি রেফারেন্স চক্র তৈরি হয়। Jackson-এর মতো লাইব্রেরি ব্যবহার করে JSON Serialization বা Deserialization করার সময় Circular Reference সমস্যা দেখা দিতে পারে।


Circular Reference উদাহরণ

উদাহরণ:

public class CircularReferenceExample {
    public static void main(String[] args) {
        try {
            ObjectMapper objectMapper = new ObjectMapper();

            // Parent এবং Child Object তৈরি
            Parent parent = new Parent();
            Child child = new Child();

            // Circular Reference
            parent.setChild(child);
            child.setParent(parent);

            // JSON Serialization
            String json = objectMapper.writeValueAsString(parent);
            System.out.println("Serialized JSON: " + json);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

class Parent {
    private String name = "Parent";
    private Child child;

    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;
    }
}

class Child {
    private String name = "Child";
    private Parent parent;

    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;
    }
}

সমস্যা:

Serialization চলাকালীন Jackson Parent এবং Child এর রেফারেন্স বারবার প্রসেস করতে গিয়ে StackOverflowError সৃষ্টি করবে।


Circular Reference সমস্যার কারণ

  1. Recursive References:
    • Parent একটি Child রেফার করে, এবং সেই Child আবার Parent রেফার করে। এই চক্র চলতেই থাকে।
  2. Serialization Logic:
    • Jackson ডিফল্টভাবে সমস্ত রেফারেন্স JSON-এ রূপান্তর করার চেষ্টা করে, যা একটি অসীম লুপের সৃষ্টি করে।

Circular Reference এর সমাধান

১. @JsonManagedReference এবং @JsonBackReference ব্যবহার

Jackson Circular Reference সমস্যা সমাধানের জন্য @JsonManagedReference এবং @JsonBackReference সরবরাহ করে।

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

class Parent {
    private String name = "Parent";

    @JsonManagedReference
    private Child child;

    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;
    }
}

class Child {
    private String name = "Child";

    @JsonBackReference
    private Parent parent;

    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;
    }
}

আউটপুট:

{
  "name": "Parent",
  "child": {
    "name": "Child"
  }
}

২. @JsonIdentityInfo ব্যবহার

আপনি Circular Reference সমাধানের জন্য @JsonIdentityInfo ব্যবহার করতে পারেন। এটি Object-এর ID ব্যবহার করে রেফারেন্স ট্র্যাক করে।

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

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

    public int getId() {
        return id;
    }

    public Child getChild() {
        return child;
    }

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

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

    public int getId() {
        return id;
    }

    public Parent getParent() {
        return parent;
    }

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

আউটপুট:

{
  "id": 1,
  "name": "Parent",
  "child": {
    "id": 2,
    "name": "Child",
    "parent": 1
  }
}

৩. Serialization Views ব্যবহার

Serialization Views ব্যবহার করে আপনি নির্দিষ্ট অংশ Serialize করতে পারেন এবং Circular Reference এড়াতে পারেন।


৪. @JsonIgnore ব্যবহার

যদি কোনো ফিল্ড Serialize না করা প্রয়োজন হয়, তাহলে @JsonIgnore ব্যবহার করা যায়।

class Child {
    private String name = "Child";

    @JsonIgnore
    private Parent parent;

    // Getters and Setters
}

Circular Reference সমস্যা সমাধানের সেরা পদ্ধতি

  • যদি Parent-Child সম্পর্ক থাকে: @JsonManagedReference এবং @JsonBackReference
  • যদি Object ID ব্যবহার করতে চান: @JsonIdentityInfo
  • যদি নির্দিষ্ট ফিল্ড বাদ দিতে চান: @JsonIgnore

  • Circular Reference হল অবজেক্টের একে অপরকে রেফার করার একটি চক্র যা JSON Serialization-এর সময় সমস্যার সৃষ্টি করে।
  • Jackson-এর @JsonManagedReference, @JsonBackReference, এবং @JsonIdentityInfo এর মতো টুল ব্যবহার করে এই সমস্যা সহজেই সমাধান করা যায়।
  • আপনার প্রয়োজন এবং ডেটা মডেলের উপর ভিত্তি করে সঠিক পদ্ধতি নির্বাচন করুন।
Content added By
Promotion

Are you sure to start over?

Loading...