使用jacksonMapper时,以双向关系丢失子数据

时间:2016-04-23 10:03:12

标签: json jackson cycle json-deserialization bidirectional-relation

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

  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;

}

知道我可能会出错吗?

1 个答案:

答案 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映射,将注释单面而不是双面注释始终是最佳实践。这样,您可以在获取数据时避免大量不必要的异常,其次,保持业务代码清洁。

JsonManagedReference vs JsonBackReference