使用 jacksonMapper 时丢失 bi-directional 关系中的 child 数据
Losing the child data in a bi-directional relationship when using jacksonMapper
我在 bi-directional 多对多关系中有两个 class 如下所示:
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 中调用以获取特定的 parent。除了 parent 详细信息外,我还想获取 parent 的 children。像这样:
Hibernate.initialize(parent.getChildSet()); //this works perfectly
// and I get the details of parent along with the children in my DAO call.
但是当我在将数据返回给控制器时在我的业务服务中执行以下操作时,parent json 字符串中省略了 children。
jacksonMapper.writeValueAsString(parent);
所以我删除了 Parent class 内的 Child 属性上的 @JsonIgnore .但它仍然不理会他们! :(
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
//@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
知道我可能哪里出错了吗?
我无法找出发生这种情况的原因。同时,我选择了一种解决方法。我正在对 DB 进行两次单独的调用。一个首先获取父项,然后根据获取的 parentId 获取子项。
或者,我可以同时进行两个数据库调用,并在将 JSON 发送到 ui 之前将其准备为复杂字符串:
complex:{
parent:parent,
child:child
}
在任何一种情况下,这都是一种解决方法。理想的解决方案是只从父端的映射中删除@Json忽略子 class。但不知何故,这似乎行不通。我会 post 以防我发现 "ideal" 解决方案不起作用的原因!
理想解决方案 2016 年 8 月 15 日印度独立日更新为答案:
问题出在映射中:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
当你说@JsonBackReference 时,它实际上意味着在写 Json 时忽略这个字段,也就是说,
@JsonBackReference <-> @JsonIgnore
因此在序列化父项时省略了子项。对于 ORM 映射,最好的做法是单面而不是双面注释。这样一来,您可以在获取数据时避免很多不需要的异常,其次,保持您的业务代码干净。
我在 bi-directional 多对多关系中有两个 class 如下所示:
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 中调用以获取特定的 parent。除了 parent 详细信息外,我还想获取 parent 的 children。像这样:
Hibernate.initialize(parent.getChildSet()); //this works perfectly
// and I get the details of parent along with the children in my DAO call.
但是当我在将数据返回给控制器时在我的业务服务中执行以下操作时,parent json 字符串中省略了 children。
jacksonMapper.writeValueAsString(parent);
所以我删除了 Parent class 内的 Child 属性上的 @JsonIgnore .但它仍然不理会他们! :(
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
//@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
知道我可能哪里出错了吗?
我无法找出发生这种情况的原因。同时,我选择了一种解决方法。我正在对 DB 进行两次单独的调用。一个首先获取父项,然后根据获取的 parentId 获取子项。
或者,我可以同时进行两个数据库调用,并在将 JSON 发送到 ui 之前将其准备为复杂字符串:
complex:{
parent:parent,
child:child
}
在任何一种情况下,这都是一种解决方法。理想的解决方案是只从父端的映射中删除@Json忽略子 class。但不知何故,这似乎行不通。我会 post 以防我发现 "ideal" 解决方案不起作用的原因!
理想解决方案 2016 年 8 月 15 日印度独立日更新为答案:
问题出在映射中:
Parent implements Serializable{
@ManytoMany(//declaration for join table)
@JsonBackReference
@com.fasterxml.jackson.annotation.JsonIgnore
Set <Child> childSet;
}
当你说@JsonBackReference 时,它实际上意味着在写 Json 时忽略这个字段,也就是说,
@JsonBackReference <-> @JsonIgnore
因此在序列化父项时省略了子项。对于 ORM 映射,最好的做法是单面而不是双面注释。这样一来,您可以在获取数据时避免很多不需要的异常,其次,保持您的业务代码干净。