使用 jacksonMapper 时丢失双向关系中的子数据



我有两个类,如下所示,处于双向多对多关系中:

  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

相关内容

  • 没有找到相关文章

最新更新