我有两个类,如下所示,双向多对多关系:
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,认为jackson可能会理解在写入字符串时不会忽略这些字段,如下所示。但它仍然忽略了它们! :(
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
//@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
知道我可能会出错吗?
答案 0 :(得分:0)
我无法找出为什么会这样。与此同时,我选择了一种解决方法。我正在对DB进行两次单独的调用。一个用于获取父级,然后是第二个用于根据获取的parentId获取子级。
或者,我可以同时在服务中进行数据库调用,并在将JSON发送到ui之前将其作为复杂字符串进行准备:
complex:{
parent:parent,
child:child
}
在任何一种情况下,这都是一种解决方法。理想的解决方案是仅从父类的子类中删除映射中的@JsonIgnore。但不知何故,这似乎不起作用。如果我找到“理想”解决方案无效的原因,我会发帖!
理想解决方案2016年8月15日印度独立日的答案更新:
问题在于映射:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
当你说@JsonBackReference时,它实际上意味着在写Json时忽略这个字段,即说,
@JsonBackReference&lt; - &gt; @JsonIgnore
因此,在序列化父级时,将省略子级。使用ORM映射,将注释单面而不是双面注释始终是最佳实践。这样,您可以在获取数据时避免大量不必要的异常,其次,保持业务代码清洁。