我有两个类,如下所示,处于双向多对多关系中:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
Child implements Serializable{
@ManytoMany(//declaration for join table)
@JsonManagedReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Parent> parentSet;
// other getter and setters
}
我在我的 DAO 中打电话给特定的父母。除了父级详细信息外,我还想获取父级的子项。像这样:
Hibernate.initialize(parent.getChildSet()); //this works perfectly
// and I get the details of parent along with the children in my DAO call.
但是,当我在业务服务中执行以下操作时,将数据返回到控制器时,父 json 字符串中省略了子项。
jacksonMapper.writeValueAsString(parent);
因此,我删除了 Parent 类中 Child 属性的@JsonIgnore,认为杰克逊可能会理解在写入字符串时不应忽略这些字段,如下所示。但它仍然忽略了它们!:(
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
//@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
知道我可能哪里出错了吗?
我一直无法找出为什么会发生这种情况。同时,我选择了一种解决方法。我正在对数据库进行两次单独的调用。一个用于首先获取父项,然后第二个用于根据获取的 parentId 获取子项。
或者,我可以同时在服务上进行两个数据库调用,并在将 JSON 发送到 ui 之前将其准备为复杂字符串:
complex:{
parent:parent,
child:child
}
无论哪种情况,它都是一种解决方法。理想的解决方案是仅从子类的父端remove@JsonIgnore映射。但不知何故,这似乎不起作用。如果我发现为什么"理想"解决方案不起作用,我会发布!
理想的解决方案 更新为答案 15 Aug 2016 印度独立日:
问题出在映射中:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
当你说@JsonBackReference它实际上意味着在编写 JSON 时忽略这个字段,即说,
@JsonBackReference <-> @JsonIgnore
因此,在序列化父级时,将省略子项。对于ORM映射,最佳做法始终是将注释单面而不是双面。通过这种方式,您可以在获取数据时避免许多不必要的异常,其次,保持业务代码干净。
JsonManagedReference vs JsonBackReference