当前位置: 首页 > 知识库问答 >
问题:

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

弓泰
2023-03-14

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

  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 on子属性,认为jackson可能会理解在写入字符串时不能忽略这些字段,如下所示。但它仍然忽略他们!:(

 Parent implements Serializable{

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

}

你知道我哪里会出错吗?

共有1个答案

唐昊焜
2023-03-14

我还没能弄清楚为什么会发生这种情况。与此同时,我选择了一种变通方法。我正在给DB打两个不同的电话。首先获取父节点,然后根据获取的父节点ID获取子节点。

或者,我可以同时进行两个DB调用,并在将JSON发送到ui之前将其准备为复杂字符串:

complex:{
parent:parent,
child:child
}

在这两种情况下,这都是一种变通方法。理想的解决方案是remove@JsonIgnore在映射中,仅从子类的父端开始。但不知何故,这似乎不起作用。如果我发现“理想”解决方案不起作用,我会发帖子!

理想解决方案于2016年8月15日印度独立日更新为答案:

问题在于映射:

Parent implements Serializable{

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

    }

当您说@JsonBackReference时,实际上意味着在编写Json时忽略此字段,即,

@JsonBackReference

因此,在序列化父级时省略子级。对于ORM映射,最好的做法是单面注释,而不是双面注释。这样,您可以在获取数据时避免许多不必要的异常,其次,保持您的业务代码干净。

JsonManagedReference与JsonBackReference

 类似资料:
  • 我在和实体之间有以下一对一的关系: 和 这一切工作得很好,但是如果我添加到类中的字段,并调用,则会失败: 原因:javax。坚持不懈RollbackException:在组织提交事务时出错。冬眠内部的例外情况ConverterImpl。org上的ConvertCommitteException(ExceptionConverterImpl.java:77)。冬眠发动机交易内部的Transactio

  • 我试图在用户和地址之间建立双向关系, 用户1-------->*地址 但是 地址1-------->1个用户 我在上网时得到了这些信息 > 对于一对一双向关系,拥有方对应于包含对应外键的方 双向关系的反向侧必须通过使用OneToOne、 OneToMany或ManyToMany批注的mappedBy元素来引用其 所属侧。mappedBy元素指定作为 关系所有者的实体中的属性或字段。 但如果我按照情

  • 我很难找到如何在Spring中从@manytomany关系中检索数据。我遇到了无限递归问题,并尝试了一些解决方案,比如使用@JSONIgnoreProperties,但都没有成功。 一个用户可以有多个组,一个组可以有多个用户。我可以将用户添加到组中,但是当涉及到检索与用户关联的所有组时,我会从无限递归中得到堆栈溢出。 理想情况下,我希望能够发送带有用户ID的get请求,然后检索与该用户关联的所有G

  • 问题内容: 假设我有两个实体: 然后,我要保留“客户”实体,然后,参照先前添加的“客户”保留“订单”实体。当我从数据库中检索此客户并调用getOrders时,它将返回空集。这是正常行为吗?如果是,当我添加新的Order实体时,我该怎么做以自动刷新此集合? 问题答案: Jpa不会为您维护关系,因此应用程序需要设置双向关系的两端,以使它们与数据库保持同步。当您设置了order-> customer关系

  • 我在谷歌上搜索过,找不到任何可以在O(1)时间内存储和读取双向数据的DS。例如书籍和作家。有了书的名字,就必须找到作者。有了作者的名字,就必须找到书。 在数据库中,这些关系(如联接表)是如何存储的? 提前谢谢。

  • 问题内容: 我有一个带有和对象的简单模型。 一个问题有很多选择。 许多选择有一个问题 有两种使用Hibernate来实现的方法 实施一:所有者是选择 Question.java Choice.java 实施二:所有者方是质询 Question.java Choice.java 两种实现之间有什么区别? 问题答案: 第一个示例是正常且正确的双向一对多/多对一映射。设置为-attribute(“拥有方