java - 如何处理与 jackson hibernate 的双向一对一关系

标签 java json hibernate jackson

我正在使用 @JsonIgnore 注释来防止在为响应创建 Json 时出现无限循环,它可以很好地满足我的需要,但我想知道是否有其他选择该属性实际上并没有被忽略,但也防止了无限循环。

例如,我的 entityA 具有以下属性:

int id
String name
EntityB example;

entityB

int id
String something
EntityA entityAExample //(this one goes with the JsonIgnore)

所以如果我得到 entityA 中的所有寄存器,响应将如下所示:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"1",
                 "something": "text"
               }
}]

实体 B 看起来像:

[{
   "id":"1",
   "something": "text"
}]

到目前为止,它对我所需要的效果很好,但我希望实体 B 也可以包含实体 A(如果是多对一关系,则为列表),因此响应如下所示:

[{
    "id":"1",
    "something": "text",
    "entityAExample": {
                      "id":"1",
                      "name": "name"
                      }
}]

因此,无论我查询哪个实体,它都会显示相关记录。

最佳答案

这是处理json时常见的双向关系问题。

我认为用 Jackson 解决这个问题的最简单方法是使用 @JsonIdentityInfo。你只需要用这样的东西来注释你的类:

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class EntityA{
    ...
}

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class EntityB{
    ...
}

这样做的目的是,当之前已经序列化的实体(即父实体 (EntityA))必须在无限递归循环开始时进行第二次序列化时,它将不会像往常一样序列化。

相反,它将使用您在注释中指定的属性进行序列化,即 id

简而言之,注释允许您指定对象的替代表示形式,该表示形式仅在实体开始无限循环时使用,从而打破该循环。

按照您的示例将导致:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"2",
                 "something": "text"
                 "entityAExample": "1"                                       
               }
}]

您也可以只注释 EntityB 而不是两个实体,这将导致:

[{
    "id":"1",
    "name": "name",
    "entityB": {
                 "id":"2",
                 "something": "text"
                 "entityAExample": {
                                    "id": "1",
                                    "name": "name",
                                    "entityBExample": "2"                                         
                                   }
               }
}]

您也可以使用其他属性,尽管“id”通常可以正常工作。 Here's官方文档和wiki .

Here's一篇更详细地解释这一点的文章和another一个显示了解决它的其他方法。

关于java - 如何处理与 jackson hibernate 的双向一对一关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34532544/

相关文章:

Java NIO FileLock 允许其他进程写入锁定的文件

c# - 访问 JToken 中的所有项目

javascript - 如何在 JavaScript 中遍历复杂的 JSON?

java - Spring 使用 SpEL 主体

hibernate - 我们什么时候使用 hibernate 的 session 刷新来对抗 setComplete()

java - 嵌套循环产生特定输出

java - Spring HATEOAS HalResourcesSerializer 未找到默认构造函数

java - 使用 Java 6/7 编译的注释可以用于 Java 8 中的类型参数吗?

mysql - 如何在 MySQL 中搜索 JSON 数据?

java - hibernate 中的继承