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
কেন এটি দরকার?
- Infinite Recursion Avoidance:
- Parent এবং child object একে অপরকে reference করলে serialization সময় infinite recursion হতে পারে।
@JsonManagedReferenceএবং@JsonBackReferenceএই সমস্যার সমাধান করে।
- Bidirectional Relationship Management:
- Serialization সময় child-এর মধ্যে parent reference এড়িয়ে চলা।
- Deserialization সময় parent-child relationship পুনরুদ্ধার করা।
গুরুত্বপূর্ণ পয়েন্ট
- Serialization:
@JsonManagedReferenceদিয়ে parent থেকে child reference serialize হয়।@JsonBackReferenceদিয়ে child থেকে parent reference বাদ দেওয়া হয়।
- Deserialization:
- Deserialization সময় parent-child সম্পর্ক স্বাভাবিকভাবে পুনরুদ্ধার হয়।
- 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 পরিচালনা করা যায়। এটি বিশেষভাবে কার্যকর যখন প্যারেন্ট-চাইল্ড সম্পর্কযুক্ত ডেটার সাথে কাজ করতে হয়।
Read more