0

当我有两个班在一个双向多对多的关系如下图所示:失去孩子的数据在双向关系使用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); 

所以我删除里面父类的思维,杰克逊可能会明白,这些领域是不可忽视的,同时,如下图所示写入字符串子属性@JsonIgnore。但它仍然会忽略它们! :(

Parent implements Serializable{ 

    @ManytoMany(//declaration for join table) 
    @JsonBackReference 
    //@com.fasterxml.jackson.annotation.JsonIgnore 
    Set <Child> childSet; 

} 

任何想法,我可能会去错了吗?

+0

你可以添加你的数据库查询吗? – k1133

+0

@ k1133数据库端我使用休眠,它是一个选择FoodItem上的所有查询。我想要的类别也与foodItem一起来。但在使用jacksonMapper时,这些类别在返回的json字符串中被遗漏。 – dirai

+0

我已经删除了Parent类中的Child属性上的@JsonIgnore,他认为Jackson可能会理解这些字段在写入字符串时不会被忽略。但它仍然会忽略它们!:( – dirai

回答

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 < - > @JsonIgnore

因此,当父项被序列化时,子项被省略。使用ORM映射,将注释标注为单侧而不是双侧是最佳实践。这样,您可以在获取数据时避免大量不必要的异常,其次,保持业务代码的清洁。

JsonManagedReference vs JsonBackReference