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

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

393

Jackson-এর @JsonManagedReference এবং @JsonBackReference annotations ব্যবহার করে bidirectional relationships (parent-child) হ্যান্ডল করা হয়। Java-তে, একাধিক ক্লাসের মধ্যে দ্বিমুখী সম্পর্ক থাকলে JSON serialization করার সময় StackOverflowError এর মতো সমস্যার সম্মুখীন হতে পারে। এই annotations JSON serialization এবং deserialization এর সময় সঠিক ভাবে parent-child সম্পর্ক পরিচালনা করতে সাহায্য করে।


@JsonManagedReference এবং @JsonBackReference এর ভূমিকা

  • @JsonManagedReference:
    • Parent সাইডে ব্যবহার করা হয়।
    • Serialization সময় child-এর reference যোগ করে।
  • @JsonBackReference:
    • Child সাইডে ব্যবহার করা হয়।
    • Serialization সময় parent reference বাদ দেয় (avoid infinite recursion)।
    • Deserialization সময় parent reference স্বাভাবিকভাবে যুক্ত থাকে।

কোড উদাহরণ

Step 1: Maven Dependency

প্রথমে, Jackson লাইব্রেরি আপনার প্রোজেক্টে যোগ করুন।

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.15.2</version>
</dependency>

Step 2: Java Classes with Bidirectional Relationship

Parent Class: User
import com.fasterxml.jackson.annotation.JsonManagedReference;
import java.util.List;

public class User {
    private String name;

    @JsonManagedReference
    private List<Post> posts; // One-to-Many relationship

    // Constructors
    public User() {}

    public User(String name, List<Post> posts) {
        this.name = name;
        this.posts = posts;
    }

    // Getters and Setters
    public String getName() {
        return name;
    }

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

    public List<Post> getPosts() {
        return posts;
    }

    public void setPosts(List<Post> posts) {
        this.posts = posts;
    }
}
Child Class: Post
import com.fasterxml.jackson.annotation.JsonBackReference;

public class Post {
    private String title;

    @JsonBackReference
    private User user; // Many-to-One relationship

    // Constructors
    public Post() {}

    public Post(String title, User user) {
        this.title = title;
        this.user = user;
    }

    // Getters and Setters
    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

Step 3: Serialization এবং Deserialization

Jackson-এর ObjectMapper ব্যবহার করে JSON serialization এবং deserialization পরিচালনা করুন।

import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Arrays;

public class JsonReferenceExample {
    public static void main(String[] args) throws Exception {
        ObjectMapper objectMapper = new ObjectMapper();

        // Create objects
        User user = new User();
        user.setName("John Doe");

        Post post1 = new Post("First Post", user);
        Post post2 = new Post("Second Post", user);

        user.setPosts(Arrays.asList(post1, post2));

        // Serialize: Java Object to JSON
        String json = objectMapper.writeValueAsString(user);
        System.out.println("Serialized JSON:");
        System.out.println(json);

        // Deserialize: JSON to Java Object
        String jsonInput = """
        {
          "name": "John Doe",
          "posts": [
            {"title": "First Post"},
            {"title": "Second Post"}
          ]
        }
        """;

        User deserializedUser = objectMapper.readValue(jsonInput, User.class);
        System.out.println("Deserialized Object:");
        System.out.println("User Name: " + deserializedUser.getName());
        System.out.println("Posts: " + deserializedUser.getPosts().size());
    }
}

Output

Serialized JSON

{
  "name": "John Doe",
  "posts": [
    {
      "title": "First Post"
    },
    {
      "title": "Second Post"
    }
  ]
}

Deserialized Object

User Name: John Doe
Posts: 2

কেন এটি দরকার?

  1. Infinite Recursion Avoidance:
    • Parent এবং child object একে অপরকে reference করলে serialization সময় infinite recursion হতে পারে।
    • @JsonManagedReference এবং @JsonBackReference এই সমস্যার সমাধান করে।
  2. Bidirectional Relationship Management:
    • Serialization সময় child-এর মধ্যে parent reference এড়িয়ে চলা।
    • Deserialization সময় parent-child relationship পুনরুদ্ধার করা।

গুরুত্বপূর্ণ পয়েন্ট

  1. Serialization:
    • @JsonManagedReference দিয়ে parent থেকে child reference serialize হয়।
    • @JsonBackReference দিয়ে child থেকে parent reference বাদ দেওয়া হয়।
  2. Deserialization:
    • Deserialization সময় parent-child সম্পর্ক স্বাভাবিকভাবে পুনরুদ্ধার হয়।
  3. Bidirectional Collections:
    • একাধিক child object থাকলেও এই পদ্ধতি কার্যকর।

ব্যবহার ক্ষেত্র

  • Entity Relationships: REST API-তে প্যারেন্ট-চাইল্ড সম্পর্কযুক্ত JSON ডেটা পাঠানো এবং গ্রহণ।
  • ORM (Hibernate): JPA/Hibernate এর সাথে bidirectional mapping ব্যবহারের সময় JSON serialization পরিচালনা।
  • Complex Data Models: Complex নেস্টেড ডেটা মডেল যেখানে bidirectional relationships রয়েছে।

@JsonManagedReference এবং @JsonBackReference annotations ব্যবহার করে bidirectional relationships সহজে এবং কার্যকরভাবে JSON serialization এবং deserialization পরিচালনা করা যায়। এটি বিশেষভাবে কার্যকর যখন প্যারেন্ট-চাইল্ড সম্পর্কযুক্ত ডেটার সাথে কাজ করতে হয়।

Content added By
Promotion

Are you sure to start over?

Loading...